三板斧本质
django视图函数必须要返回一个HttpResponse对象
render、redirect内部是继承了HttpRespone类
JsonResponse
需求:给前端返回json格式数据
方式1:自己序列化
res = json.dumps(d,ensure_ascii=False)
return HttpResponse(res)
方式2:JsonResponse
from django.http import JsonResponse
def func1(request):
d = {‘user‘:‘a‘,‘password‘:123}
return JsonResponse(d)
ps:额外参数补充
json_dumps_params={‘ensure_ascii‘:False} # 返回值取消转义
safe=False # 允许输入除字典外的数据类型
# JsonResponse返回的也是HttpResponse对象
FBV与CBV
FBV
基于函数的视图
CBV
基于类的视图
# CBV基本使用
# view.py:
from django.views import View
class MyView(View):
def get(self,request):
return HttpResponse("get方法")
def post(self,request):
return HttpResponse("post方法")
# urls.py:
url(r‘^func‘,views.MyView.as_view())
"""为什么能够自动根据请求方法的不同执行不同的方法"""
1.突破口
as_view()
2.CBV与FBV路由匹配本质
url(r‘^func4‘,views.MyView.as_view())
# 等价 CBV路由配置本质跟FBV一样
url(r‘^func4‘,views.view)
3.源码
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # self = MyView() 生成一个我们自己写的类的对象
return self.dispatch(request, *args, **kwargs)
return view
def dispatch(self, request, *args, **kwargs):
# 获取当前请求并判断是否属于正常的请求(8个)
if request.method.lower() in self.http_method_names:
# get请求 getattr(对象,‘get‘) handler = 我们自己写的get方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 执行我们写的get方法并返回该方法的返回值
cbv加装饰器
# cbv加装饰器可以加在类上:
@method_decorator(auth,name=‘get‘) #给get请求加装饰器
# 可以加在方法上
@method_decorator(auth)
def get(self, request, *args, **kwargs):
pass
form表单上传文件
form表单上传文件注意事项
1.method必须是post
2.enctype参数修改为multipart/form-data
def func(request):
if request.method == ‘POST‘:
print(request.POST)
file_obj = request.FILES.get(‘myfile‘)
print(file_obj.name) # 获取文件名称
with open(r‘%s‘%file_obj.name,‘wb‘) as f:
for chunks in file_obj.chunks():
f.write(chunks)
return render(request,‘func.html‘)
原文:https://www.cnblogs.com/shof/p/14646840.html