Hzangyao

导航

django生命周期流程以及无有名分组和反向解析 JsonResponse和form表单上传

django的请求生命周期流程图

要求每个人必须会画,帮助你梳理django的大致流程

路由层

1. 路由匹配:urls.py 这个文件是django框架的总路由文件,意味着还有分路由文件,每个应用都支持有自己的路由文件。

# 控制django是否自动加斜杠匹配
APPEND_SLASH = False

 url(r'^test/$', views.test),
    
'''
	路由匹配规则:
		路由从上往下依次匹配,如果路由第一次匹配到了,那么,就会执行对应的视图函数,就不在往下匹配了。
'''
2. django2中的路由文件
	path  # 精准匹配
    re_path # 类似于url,支持正则表达式

无名分组有名分组

# 1. 无名分组: 正则表达式匹配大的内容用括号括起来
# 2. 有名分组:正则表达式匹配大的内容用括号括起来,然后起个名字
url(r'^test/(\d+)', views.test),
url(r'^test/(\d+)/(\w+)/(\d+)/(\d+)', views.test),
无名分组会把括号中匹配的数字当成位置参数传给视图函数, 支持多个匹配规则。

url(r'^test/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)', views.test),
有名分组会把括号中匹配的数字当成关键字参数传给视图函数, 支持多个匹配规则。

# 无名和有名不能混合使用

get请求传参方式:
	https://www.bilibili.com/movie/?spm_id_from=333.1007.0.0
    https://www.cnblogs.com/qingmiaokeji/p/16026631/a/1/b/2/c/3.html

反向解析

# 就是通过一个路由别名可以得到该别名对应的路由地址

# 后端反向解析
url(r'^test/v1/v2/v3/v4', views.test, name='aaaa'),
print(reverse('aaaa'))

# 前端反向解析
<a href="{% url 'aaaa' %}">点我</a>

# 无名分组反向解析
url(r'^test/(\d+)', views.test, name='xxxx'),
# 后端反向解析
 print(reverse('xxxx', args=(id, )))
# 前端反向解析
<a href="{% url 'xxxx' 3333 %}">点我</a>


# 有名分组反向解析
url(r'^test/(?P<year>\d+)/(?P<month>\d+)', views.test, name='xxxx'),
# 后端反向解析
 print(reverse('xxxx', args=(id, )))
# 前端反向解析
<a href="{% url 'xxxx' year=2022 month=9 %}">点我</a>

路由分发

以后我们的django项目会越来越大,那么就会导致总路由文件越来越大,非常难维护,我们会把总路由分开到不同的应用下面去。

'''
	django支持每一个应用下面有自己的
		1. urls.py
		2. static文件夹
		3. templates
'''

# 怎么样把这些应用串起来呢?就是使用路由分发
'''
	使用路由分发的场景:一定是有多个应用的情况采用
'''

路由分发的两种方式:
	1.  
     from app01 import urls as app01_urls
	from app02 import urls as app02_urls
    # url(), 的第一个参数不能加$
    url(r'^app01/', include(app01_urls)),
    url(r'^app02/', include(app02_urls)),
    
    2.
    # 第二种方式
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),

名称空间(了解)

 	url(r'^app01/', include('app01.urls', namespace='app01')),
    url(r'^app02/', include('app02.urls', namespace='app02')),
    
    print(reverse('app01:xxxx'))
    print(reverse('app02:xxxx'))

虚拟环境

# 针对不同的项目,创建出来一个新的python环境,类似于是一个纯净版的python解释器

JsonResponse

# 1. 混合项目开发:用不到json格式的数据
# 2. 前后端分离项目:用的都是json格式的数据

json格式的数据:跨语言数据传输
序列化数据为json
import json

1. dumps: 序列化
2. loads:反序列化

# 前端中序列化和反序列化
1. JSON.stringify()  # 序列化
2. JOSN.parse()      # 反系列化

from django.http import JsonResponse
def ab_json(request):
    # user_dict = {'username': 'ly大帅哥', 'gender': 'male'}
    l = [1, 2, 3]
    # res = json.dumps(user_dict, ensure_ascii=False)
    # return HttpResponse(res)
    # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(l, safe=False)

CBV和FBV的使用

1. FBV: function base viewd
2. CBV:class base viewd

CBV的路由:
    # cbv的路由如何写?固定写法
    url(r'^index_cbv/', views.IndexView.as_view()),
    
    
# CBV:必须继承View类
from django.views import View

# 在CBV中,类中的方法名不能所以叫,只能叫请求方式的名称
# get, post
# 请求方式一共有8种,目前学了2种
# 关键问题在于:CBV的路由该如何写?

# 是如何请求到get方法的呢?
# 如果你是get请求方式,那么就会触发get方法
# 如果你是post请求方式,那么就会触发post方法
class IndexView(View):
    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')

form表单上传文件

# form表单上传文件的条件:
1. method = 'post'
2. enctype="multipart/form-data"

# form表单上传文件
def ab_form(request):
    # 如何接收文件数据呢?
    if request.method == 'POST':
        # 文件数据不在request.POST
        # print(request.POST)
        # print(request.GET)
        # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: django请求生命周期流程图.png (image/png)>]}>
        print(request.FILES)
        print(request.POST) # <QueryDict: {'username': ['root']}>
        '''request.FILES只接收文件数据,其余数据不接收'''
        file_obj = request.FILES.get('myfile')  #
        # 文件名称
        print(file_obj.name)  # pycahrm创建应用.png
        '''怎么解决图片被覆盖的问题?'''
        import uuid
        rend_str=uuid.uuid4()
        import random
        file_path = str(rend_str) + '.png'
        # with open(file_obj.name, 'wb') as f:
        with open(file_path, 'wb') as f:
            # 上传文件读取的时候要一行一行的读取,目的是为了防止内存爆满
            for line in file_obj:
                f.write(line)
    return render(request, 'ab_form.html')

posted on 2022-03-24 10:14  Hzangyao  阅读(22)  评论(0编辑  收藏  举报