《Django Web典型模块开发实战》
一、Django组件
1、AOP(Aspect Oriented Programming,面向切面编程)
2、Django REST framework
10个常用组件如下:
- 权限组件
- 认证组件
- 访问频率限制组件
- 序列化组件
- 路由组件
- 视图组件
- 分页组件
- 解析器组件
- 渲染器组件
- 版本组件
二、组件介绍
1、Django REST framework序列化
序列化(Serialization)是指将对象的状态信息转换为可以存储或传输形式的过程。在客户端与服务端传输的数据形式主要分为两种:XML和JSON。
在Django中的序列化就是指将对象状态的信息转换为JSON数据,以达到将数据信息传送给前端的目的
- Serializer与ModelSerializer
- Django REST framework视图三层封装
- mixins.ListModelMixin+GenericAPIView
- generics.ListAPIView
- 用viewsets+Router的方式实现视图封装
from .serializers import BookModelSerializer from rest_framework.response import Response from .models import UserProfile, Book from rest_framework import viewsets from rest_framework.permissions import BasePermission class IsDeveloper(BasePermission): message = "查无此人啊" def has_permission(self, request, view): APIKey = request.query_params.get("apikey", 0) developer = UserProfile.objects.filter(APIkey=APIKey).first() if developer: return True else: print(self.message) return False class EnoughMoney(BasePermission): message = "兄弟,又到了需要充钱的时候!好开心啊!" def has_permission(self, request, view): APIKey = request.query_params.get("apikey", 0) developer = UserProfile.objects.filter(APIkey=APIKey).first() balance = developer.money if balance > 0: developer.money -= 1 developer.save() return True else: return False class BookModelViewSet(viewsets.ModelViewSet): authentication_classes = [] # 必须加的,如果不加,虽然权限组件依然起作用,但是在权限通不过的时候,detail将不会显示我们自定义的message的内容,而永远只是提示认证未通过 permission_classes = [IsDeveloper, EnoughMoney] queryset = Book.objects.all() serializer_class = BookModelSerializer def get_queryset(self): isbn = self.request.query_params.get("isbn", 0) books = Book.objects.filter(isbn=int(isbn)) queryset=books return queryset
-
Django REST framework 安装依赖包
pip install djangorestframework markdown django-filter pillow django-guardian coreapi
-
Django REST framework的选择器,大家可以根据自己的喜好,选择
- JSONRenderer
- BrowsableAPIRenderer
-
解决跨域问题
- 在后端Django项目中安装相关模块
pip install Django-cors-hearders
- 在settings.py中的注册里配置
INSTALLED_APPS = [ ......, "crosheaders", ]
- MIDDLEWARE里设置
MIDDLEWARE = [ "crosheaders.middleware.CrosMiddleware", # 放在中间件的顶部 ]
- 新增配置项
CORS_ORIGIN_ALLOW_ALL = True
2、身份认证
-
UGC(User-generated Content,用户生产内容),也可称为UCC(User-created Content)
- 相关概念
- PGC(Professional-generated Content),由有专业知识的人所生产的内容。
- OGC(Occupationally-generated Content),职业生产内容者所生产的内容。
-
内容生产者认证
image.png
- 相关概念
-
Cookie与Session
-
Cookie
- 保存在用户的浏览器中
- 可以主动清除
- 可以被伪造
- 不可以跨站共享Cookie
-
Session
-
与cookie区别
- Session机制的工作原理与Cookie的签名加密机制的原理相似。区别在于,Cookie机制是将用户的信息存储在客户端浏览器里,而Session机制是将用户的信息存储于服务端的一个散列表里,返回给用户一个Session_id,让用户在登录成功后的每一次数据请求都带上Session_id,服务端根据Session_id来创建和更新Session表中的数据,并返回给用户特定的数据。
- Session是基于Cookie的一种机制,属于Cookie机制的一种改进。
- Session机制比Cookie机制更安全,比如用户名和密码等敏感信息不用返回给浏览器。Session机制无法被反解。能做到这一点,归根结底是因为Session机制是将用户的登录信息存储在服务器端,而非存储在客户端浏览器中。
-
配置
- 服务器端配置
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 默认 SESSION_COOKIE_NAME="sessionid" # Session的Cookie保存在浏览器上时的key SESSION_COOKIE_PATH="/" # Session的Cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的Cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否HTTPS传输Cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的Cookie只支持HTTP传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的Cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改后才保存
- SESSION_ENGINE:配置不同的Session引擎,代表了将Session数据储存在服务器的不同地方。Django中支持Session,其中内部提供了5种类型的Session供开发者使用,分别是数据库(默认)、缓存、文件、缓存+数据库、加密Cookie
# 数据库(引擎(默认)) SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 缓存 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS= 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 # 文件 SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH=None #缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 缓存+数据库 SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
-
-
Cookie/Session的局限性,不适合在多端分离的项目中使用
- 首先Cookie和Session都将数据存储于浏览器的Cookie中
- 同源策略的局限性,Cookie不能跨站,阻碍平台之间的数据共享
-
-
Token
概念:从各个终端与服务端进行数据交互的身份验证的字符串,就是Token
-
使用形式
image.png
-
Django REST framework的Token的
- 局限性
- 缺少Token的有效期时间字段
- 不利于分布式部署或多个系统使用一套验证:Token表只能放在一台服务器上,如果每一次数据请求都要查询一次数据库的整个用户表,那么对于服务器来说将是很大的消耗
- 解决办法:
- Json Web Token(Json Web Token,简称JWT)
-
原理:JWT的数据结构是很长的一段字符串,使用.将其分为3个部分,依次:Header(头部),Payload(负载),Signature(签名):jwt数据.png
- JWT生命周期
-
原理:JWT的数据结构是很长的一段字符串,使用.将其分为3个部分,依次:Header(头部),Payload(负载),Signature(签名):
- Json Web Token(Json Web Token,简称JWT)
- 局限性
JWT生命周期.png
-
Django Token使用
- settings.py
INSTALLED_APPS = [ ......, 'rest_framework.authtoken' # 执行数据更新命令,数据库中会自动生成一张authtoken_token表 ] # 在settings中不但要加入认证的配置代码,还要加入权限的配置代码,如果不加入权限的配置代码,那么认证代码将无法阻止未认证用户获取到本应该只有已认证的用户才可以获取到的数据信息 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', #必须有 ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) }
- urls.py中配置Token登录的路由
from rest_framework.authtoken import views urlpatterns = [ #…… #drf自带的Token认证模式 path('api-token-auth/', views.obtain_auth_token), ]
-
JWT在Django中的应用
$ pip install djangoframework-jwt
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', # 必须有 ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ) } import datetime JWT_AUTH = { # 指明Token的有效期 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
-
区块链技术
- 举例:
- 有一道题,要求你根据条件A,计算出结果B,而这道题的特点是,由A向B计算,最后得到B的过程,需要大量的计算工作,而一旦计算得出了B,通过B来印证A的正确性,则只需要少量的计算即可。将题目所有的条件与结果进行连接,这样任何一个节点上有改变,都会造成后面所有节点的改变,从而达到没有办法弄虚作假的效果
- 应用:
- 消灭假货。基于区块链技术,每一个品牌的每一件商品,都可以有全世界唯一的商品标识,而且还可以非常低的成本验证这些商品的信息。
- 消灭注册。当网络实名制彻底普及以后,完全可以通过区块链技术,让每个人都可以使用同一个账号登录任何一个网站,不需要像现在这样,每下载一个新的应用程序,都要通过手机号注册一个账号,如果长时间不使用,还容易将账号和密码忘记。人脸识别技术和区块链技术的配合,说不定可以使“登录密码”这种验证方式成为历史。
- 消灭盗版。目前所有打击盗版的成本,都由支持正版的人在承担,这显然并不合理。区块链技术可以帮助那些支持正版的人分享利润,同时区块链技术也有利于打击盗版。
- 举例:
3、Vue
- 安装cnpm
npm install cnpm --registry=https://registry.npm.taobao.org
- 安装vue脚手架工具
cnpm install --global vue-cli
- 初始化项目
$ vue init webpack-simple Project-demo # 然后连续按5次回车 $ cd Project-demo $ cnpm install $ npm run dev
- axios
安装网络请求模块axios
-
--save,将模块的注册信息写入前端项目的配置信息中
cnpm install axios --save