视图层
程咬金的三板斧
- HttpResponse
返回字符串类型 - render
返回html页面 并且在返回给浏览器之前还可以给html文件传值 - redirect
重定向
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)
JsonResponse对象
JsonResponse是HttpResponse的子类,用来生成JSON编码的响应
def ab_json(request):
user_dic = {'username':'zc你好', 'password': '123'}
"""这里的汉字在页面上显示的是编码字符,需要转成汉字,要去到JsonResponse查看源码,找到解决方案"""
# return JsonResponse(user_dic,json_dumps_params={'ensure_ascii':False})
l=[111,222,333]
return JsonResponse(l,safe=False)
"""
在页面显示列表会报错
In order to allow non-dict objects to be serialized set the safe parameter to False.
默认只能序列化字典,序列化其他的需要safa参数
"""
request对象方法
-
path_info 返回用户访问url,不包括域名
-
method 请求中使用的HTTP方法的字符串表示,全大写表示。
-
GET 包含所有HTTP GET参数的类字典对象
-
POST 包含所有HTTP POST参数的类字典对象
-
body 请求体,byte类型 request.POST的数据就是从body里面提取到的
form表单上传文件
form 表单上传文件method必须指定post,enctype必须换成formdata
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:
f.write(line)
return render(request,'form.html')
<form action="" method="post" enctype="multipart/form-data">
<p>username:<input type="text" name="username"></p>
<p>file:<input type="file" name="file"></p>
<input type="submit">
</form>
FBV和CBV
CBV: 路由
url(r'^login/',views.MyLogin.as_view())
视图:
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'form.html')
def post(self,request):
return HttpResponse('post方法')
CBV和FBV都有自己的特点,CBV能够直接根据请求的方式的不同直接匹配到对应的方法执行
CBV源码解析
- 如何寻找突破口呢,答案在url里面,在url里面的
url(r'^login/',views.MyLogin.as_view())
的MyLogin.as_view()
这个相当于对象的实例化,当我们点进去as_view
是一个类方法,这个就是和FBV形式一致 - 看到里面的
as_view
是一个闭包函数内部实例化了MyLogin
对象,就是处理匹配该url的一个对象,调用dispatch
方法 - 该对象的没有
dispatch
方法,按照队形属性查找顺序,最后找到父类view
的dispatch
,我们在内部假如定义了dispatch
,此时的view
会被覆盖,dispatch
采用反射的,根据请求方式的不同,动态匹配到对象的get
方法,或pos
t方法
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
return view
# CBV的精髓
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)