赞
踩
目录
在Django中,我们通过浏览器URL发送了请求,请求通过路由层,最后匹配到相应的视图函数
在视图函数中,也分两种编写形式:FBV、CBV
接下来,我们来看看CBV和FBV两种范式
所谓FBV就是function based views ,函数式编写视图,也就是通过函数的形式,来编写视图:
- def test(request):
- print(request.resolver_match)
- return HttpResponse('code')
这就是最简单的FBV编写视图的形式。
但是我们请求是分为很多种的,我们需要额外进行判断:
- def test(request):
- if request.method == 'GET':
- print(request.resolver_match)
- return HttpResponse('get')
- else:
- return HttpResponse('这是post')
所谓CBV就是clss based views ,类编写视图,也就是通过类的形式,来编写视图:
- class User(View):
- def get(self , request):
- print('hello')
- return HttpResponse('我是get')
-
- def post(self , request):
- return HttpResponse('我是post')
在CBV中,一种函数代表一种请求方式
FBV:
path('test/', views.test)
CBV:
path('user/' , views.User.as_view())
FBV:
一般用于前后端不分离
CBV:
一般用于前后端分离(小程序API ,DRF)
request封装了HTTP请求对象,本质上是一个WSGIRequest对象,源码如下:
我们大致可以看看request里面都有什么,这肯定少不了源码啦(这个时候,研究源码的好处就来咯)
- def __init__(self, environ):
- script_name = get_script_name(environ)
- # If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
- # trailing slash), operate as if '/' was requested.
- path_info = get_path_info(environ) or "/"
- self.environ = environ
- self.path_info = path_info
- # be careful to only replace the first slash in the path because of
- # http://test/something and http://test//something being different as
- # stated in RFC 3986.
- self.path = "%s/%s" % (script_name.rstrip("/"), path_info.replace("/", "", 1))
- self.META = environ
- self.META["PATH_INFO"] = path_info
- self.META["SCRIPT_NAME"] = script_name
- self.method = environ["REQUEST_METHOD"].upper()
- # Set content_type, content_params, and encoding.
- self._set_content_type_params(environ)
- try:
- content_length = int(environ.get("CONTENT_LENGTH"))
- except (ValueError, TypeError):
- content_length = 0
- self._stream = LimitedStream(self.environ["wsgi.input"], content_length)
- self._read_started = False
- self.resolver_match = None
我们大概可以梳理一下:
当然,下面还有很多方法可以使用,常用的就这几个:
- request.method # 请求方法
- request.GET # get请求参数,也就是url的?后面的
- reqeust.POST # post请求参数
- request.FILES # 文件参数
- request.path_info # 路径
- request.body # 原始请求数据
- from Django.http import JsonResponse
- from django.shortcuts import render, HttpResponse,redirect
一般JsonResponse返回的数据中文是乱码的 , 这个时候就要加上后面的参数.
- 中文显示:
- JsonResponse({"吊毛": 1}, json_dumps_params={'ensure_ascii': False})
- 301和302
- 301:永久重定向,相当于直接替换掉,一般用于域名跳转
- 302:临时重定向,相当于保留原地址,一般用作临时的跳转
Django业务开发离不开视图层,熟练掌握视图层,能让我们更好的开发业务需求。
我们经常都会用到requets封装的参数,例如获取请求方法、请求体等
最后就是返回值问题,HttpResponse一般用于返回字符串内容,而JsonResponse一般返回json数据等等,采用合适的返回值能让业务走的更流通。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。