django

视图

django 函数视图与类视图

  • FBV: function base view
  • CBV: class baes view 基于反射原理根据请求方法处理不同,执行不同的函数

类视图原理:

a. 路由 url -> view() -> dispatch()反射原理实现执行不同的方法

函数视图与类视图代码对比:

  1. # 函数视图
  2. def user(request):
  3. return HttpResponse('hello world')
  4. # 类视图
  5. from django.views import View
  6. class StudentView(View):
  7. def get(self,request, *args, **kwargs):
  8. return HttpResponse('hello view get')
  9. def post(self,request, *args, **kwargs):
  10. return HttpResponse('hello view post')
  11. def put(self,request, *args, **kwargs):
  12. return HttpResponse('hello view put')

中间件

middleware

01 了解 - 图1

  1. 所有中间件
  • process_reqeust
  • process_view
  • process_response
  • process_exception
  • process_renader_template
  1. 中间件的应用场景
  • 权限
  • 用户登录
  • csrftoken
  1. django的csrf是如何实现的?

使用 process_view 方法实现,因为需要检查视图函数是否有使用装饰器@csrf_exempt,去请求体或者cookie中获取token

  1. django中CSRF配置,支持两种方式(基于函数视图)

全站启用CSRF,指定视图不启用

  1. # settings.py -> MIDDLEWARE
  2. # 'django.middleware.csrf.CsrfViewMiddleware'
  3. from django.views.decorators.csrf import csrf_exempt
  4. @csrf_exempt
  5. def index(request):
  6. return HttpResponse('hello index')
  1. 全站禁用CSRF,指定视图启用

  1. from django.views.decorators.csrf import csrf_protect
  2. def users(reqeust):
  3. user_list = ['wang', 'li']
  4. return HttpResponse(json.dumps({user_list}))
  1. 在类视图中使用CSRF,基于装饰器

  2. 装饰类方法

  3. 装饰类本身
  1. from django.utils.decorators import method_decorator
  2. # 方法1
  3. class StudentView(View):
  4. @method_decorator(csrf_exempt)
  5. def dispatch(self, request, *args, **kwargs):
  6. return super().dispatch(request, *args, **kwargs)
  7. def get(self, request, *args, **kwargs):
  8. return HttpResponse('GET')
  9. def post(self, request, *args, **kwargs):
  10. return HttpResponse('POST')
  11. # 方法2
  12. @method_decorator(csrf_exempt, name='dispatch')
  13. class StudentView(View):
  14. def dispatch(self, request, *args, **kwargs):
  15. return super().dispatch(request, *args, **kwargs)
  16. def get(self, request, *args, **kwargs):
  17. return HttpResponse('GET')
  18. def post(self, request, *args, **kwargs):
  19. return HttpResponse('POST')

RESTful API规范

  1. 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
  2. 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
  3. 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
  4. 204 NO CONTENT - [DELETE]:用户删除数据成功。
  5. 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
  6. 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
  7. 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
  8. 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  9. 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
  10. 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
  11. 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
  12. 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
  • 错误处理,状态码是4xx时,应返回错误信息,使用error做key;{error: “Invalid API key”}
  • 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
  1. GET /collection:返回资源对象的列表(数组)
  2. GET /collection/resource:返回单个资源对象
  3. POST /collection:返回新生成的资源对象
  4. PUT /collection/resource:返回完整的资源对象
  5. PATCH /collection/resource:返回完整的资源对象
  6. DELETE /collection/resource:返回一个空文档
  • Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
  1. [
  2. {
  3. id:1,
  4. name: 'iphone',
  5. url: http://xxx.cn/1,
  6. },
  7. {
  8. id:2,
  9. name: 'xiaomi',
  10. url: http://xxx.cn/2,
  11. },
  12. ]

摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

django rest framework

01 了解

DRF基本介绍

  1. from django.views import View # django
  2. from rest_framework.views import APIView # djangorestframework
  3. from rest_framework.authentication import BasicAuthentication
  4. from rest_framework import exceptions
  5. class MyAuthenticataoin:
  6. """
  7. 自定义认证类
  8. """
  9. def authenticate(self, request):
  10. token = request._request.GET.get('token')
  11. # 可以操作
  12. # 获取用户名
  13. # 数据库验证用户
  14. if not token:
  15. raise exceptions.AuthenticationFailed('用户认证失败')
  16. # 第一个参数:'wangdachui' 用户,绑定到request.user
  17. return ('wangdachui', None)
  18. def authenticate_header(self, val):
  19. pass
  20. class DogView(APIView):
  21. authentication_classes = [MyAuthenticataoin,]
  22. def get(self, request, *args, **kwargs):
  23. print(request)
  24. # <rest_framework.request.Request object at 0x0455C950>
  25. ret = {
  26. 'code':1000,
  27. 'msg':'xxx',
  28. }
  29. return HttpResponse(json.dumps(ret), status=201)
  30. def post(self, request, *args, **kwargs):
  31. pass
  32. def put(self, request, *args, **kwargs):
  33. pass