Django中视图层中JsonResponse对象、三板斧关系、form表单上传文件、request方法、FBV与CBV及源码解析

视图层

三板斧

三者的关系

视图函数必须要返回一个HttpResponse对象

"""
HttpResponse
	返回字符串类型
render
	返回html页面 并且在返回给浏览器之前还可以给html文件传值
redirect
	重定向
"""
# 视图函数必须要返回一个HttpResponse对象  正确   研究三者的源码即可得处结论

image

image

render简单内部原理

from django.template import Template,Context
    res = Template('<h1>{{ user }}</h1>')
    con = Context({'user':{'username':'jason','password':123}})
    ret = res.render(con)
    print(ret)
    return HttpResponse(ret)

image

JsonResponse对象

python的json小复习

json格式的数据有什么用?
前后端数据交互需要使用到json作为过渡 实现跨语言传输数据

urlpatterns = [
    # json相关
    url(r'^json/', views.ab_json)
]

import json
def ab_json(request):
    dic = {'name': 'jason', 'pwd': 123}
    res = json.dumps(dic)
    return HttpResponse(res)

image

import json
def ab_json(request):
    dic = {'name': 'jason好帅', 'pwd': 123}
    res = json.dumps(dic)
    return HttpResponse(res)

出现乱码

image

解决:

import json
def ab_json(request):
    dic = {'name': 'jason好帅', 'pwd': 123}
    res = json.dumps(dic, ensure_ascii=False) # 默认True  改为False
    return HttpResponse(res)

image

JsonResponse使用

乱码问题

from django.http import JsonResponse
def ab_json(request):
    dic = {'name': 'jason', 'pwd': 123}
    return JsonResponse(dic)

image

乱码情况

from django.http import JsonResponse
def ab_json(request):
    dic = {'name': 'jason好帅', 'pwd': 123}
    return JsonResponse(dic)

image

解决(看源码):

image

from django.http import JsonResponse
def ab_json(request):
    dic = {'name': 'jason好帅', 'pwd': 123}
    # res = json.dumps(dic, ensure_ascii=False)
    return JsonResponse(dic, json_dumps_params={'ensure_ascii':False}) # 当成字典传入

image

增加新的数据类型

默认是只能转字典的数据类型,其他不行

看源码:

image

from django.http import JsonResponse
def ab_json(request):
    ll = [1,2,3,4]
    return JsonResponse(ll, safe=False)

image

form表单上传文件及后端如何操作

from注意事项

form表单上传文件类型的数据
	1.method必须指定成post
	2.enctype必须换成'multipart/form-data'

获取文件信息

def ab_file(request):
    if request.method == 'POST':
        print(request.FILES)  # 获取文件数据
        file_obj = request.FILES.get('file')  # 获取文件对象
        print(file_obj.name)  # 获取文件名
        return render(request, 'home.html')
    return render(request, 'home.html')

image

保存文件

def ab_file(request):
    if request.method == 'POST':
        file_obj = request.FILES.get('file')  # 获取文件对象
        with open(file_obj.name, 'wb') as f:
            for line in file_obj.chunks():  # 可以直接for循环这个文件对象的方法  不加也行直接for循环对象
                f.write(line)
        return render(request, 'home.html')
    return render(request, 'home.html')

image

request对象方法

方法 作用
request.method 获取请求方式
request.POST post请求
request.GET get请求
request.FILES 获取文件
request.path 获取url
request.path_info 获取url
request.get_full_path() 获取url及问号后的内容
request.body 获取浏览器传来的二进制数据

image

FBV与CBV

视图函数既可以是函数也可以是类

# 在urls.py里
urlpatterns = [
    # CBV路由
    url(r'class/', views.Myclass.as_view())
]

# 在view.py里
from django.views import View

class Myclass(View):
    def get(self,request):
        return render(request, 'home.html')

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

image

结论:

CBV特点:能够直接根据请求方式的不同直接匹配到对应的方法执行

CBV源码剖析

  1. 首先看urls.py里的参数

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.Mylogin.as_view())
    ]
    
  2. 再看下view.py里的视图函数

    from django.views import View
    
    class Mylogin(View):
        def get(self, request):
            return render(request, 'login.html')
    
        def post(self, request):
            return HttpResponse('收到信息')
    

image

image

image

image

image

结论:

CBV与FBV在路由匹配上本质是一样的 都是路由 对应 函数内存地址

看python源码注意事项:

'''
    你在后面看python源码的时候 只要看到self点东西 
  	你一定要问你自己一些当前这个self到底是谁???
  		属性方法查找顺序
  			对象本身找
  			产生对象的类中
  			类的父类们
'''
posted @ 2022-03-01 15:47  zong涵  阅读(89)  评论(0编辑  收藏  举报