视图层三剑客(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)
标签:return,04,request,视图,django,json,HttpResponse,def,view From: https://www.cnblogs.com/juzijunjun/p/16979044.html