视图层三剑客(render,HttpResponse,redirect)
# 1.用于处理请求的视图函数都必须返回HttpResponse对象
"""
render,HttpResponse的底层都是HttpResponse
redirect则是因为在其继承的祖先类中存在HttpResponse
"""
render源码:
def render(request, template_name, context=None, content_type=None, status=None, using=None):
return HttpResponse(content, content_type, status)
HttpRespon:
本身就是HttpResponse对象
redircect源码:
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
"""redirect_class,是三元表达式,permanent默认为False,执行后面条件"""
- HttpResponseRedirect类内:
class HttpResponseRedirect(HttpResponseRedirectBase):
- HttpResponseRedirectBase类内:
class HttpResponseRedirectBase(HttpResponse):
"""可以看到最后继承的祖先是HttpResponse类"""
JsonResponse对象
# 1.导入:
from django.http import JsonResponse
# 2.将字典以json格式的字符串返回出来
user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
- 方法一:
json_str = json.dumps(user_dict,ensure_ascii=False)
return HttpResponse(json_str)
return JsonResponse(user_dict)
- 方法二:
from django.http import JsonResponse # 导入该模块
JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})
# 序列化非字典类型的数据还需要指定safe参数为False
# 3.JsonResponse模块的源代码:
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs):
if json_dumps_params is None:
json_dumps_params = {}
data = json.dumps(data, cls=encoder, **json_dumps_params)
request对象获取文件
# 1.form表单携带文件类型数据条件
条件1: method必须是post
条件2: enctype必须是multipart/form-data
# 2.request对象方法
request.method 该方法可以获取请求方式(GET/POST)纯大写
# POST请求:
request.POST 获取POST请求发送来的普通数据(不包含文件)
# 获取到的值是一个字典形式的数据(键必须存在)
request.POST.get() 不指定,默认只获取字典里面列表中最后一个数据
request.POST.getlist() 默认获取键对应的整个列表,有几个拿几个,也可以在括号内填写索引值
# GET请求:
request.GET 获取URL后面携带的非敏感数据
request.GET.get() 不指定,默认只获取列表中的是最后一个
request.GET.getlist() 获取键对应的整个列表,有几个拿几个
视图层FBV与CBV
# 1.FBV:基于函数的视图
def index(request):
return HttpResponse对象
路由:
path('index/', views.index)
# 2.CBV:基于类的视图
from django import views
class MyLoginView(views.view):
def get(self,request):
return HttpResponse('from CBV get function')
def post(self,request):
return HttpResponse('from CBV post function')
路由:
path('login/', views.MyLoginview.as_view())
"""CBV会根据请求方法的不同自动去匹配类中对应的方法去执行"""
CBV源码
# 1.从CBV路由开始剖析源码
path('login/', views.MyLoginView.as_view())
-1.类名点名字(名字的查找问题)
-2.类名点名字并加括号调用(静态方法,绑定给类的方法)
# 2.函数名加括号执行优先级最高,项目一启动就会自动执行as_view方法
path('login/',views.view) # CBV路由本质就是FBV
# 3.浏览器访问login路由需要执行view函数
-1.产生自己编写的类的对象
-2.对象调用dispatch方法
-3.研究父类中的dispatch方法
# 4.研究父类里的dispatch方法
获取当前请求方法并转小写,之后利用反射获取类中对应方法并执行
# 5.源码
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)