在实际开发工作中,我们使用django开发之前,需要对django配置文件进行简单的设置:
1.sys.path 2. mysql数据库的配置 3.缓存的配置 4.session的配置 5. 日志 6.异常处理
相关的命令: 创建数据库:create database 数据库名称 charset=utf8;
创建用户: create user yong 用户名 identified by 密码
授权: grant all on 数据库名称 to 用户名 @ ‘%’(%是指访问任意一台主机)
刷新权限: flush privileges
当在开发过程中,不可避免的要进行跨域访问,为了能解决跨域访问,可以安装第三方包:
1.pip install django-cors-headers
2. 在settings.py配置文件中安装应用:INSTALLED_APPS=【
...,
'corsheaders',
...
】
3.在中间件的第一项(必选在第一项)加上
‘corsheaders.middleware.CorsMiddleware’,
...
4.设置白名单:
凡是出现在白名单中的域名,都可以访问后端接口
# 配置cors的白名单: CORS_ORIGIN_WHITELIST=(WWW.***.site:8080)
CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否支持对cookie的操作
# CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
5.设置当前网站的域名:
ALLOWED_HOSTS = [
'api.meiduo.site',
]
====================定义用户模型类
在django做贡献的认证系统基础上,进行开发
默认属性:用户名、密码、邮箱
1.class User(AbstractUser):
扩展自己的属性
2.配置,指定自己的类为认证类型
AUTH_USER_MODEL='应用.类型User'
====================短信验证码
1.判断是否已经发过,发过则抛异常
2.如果未发过,则随机生成
3.存入redis
验证码
发送标记
4.发送(云通讯)
5.响应
====================celery
当使用框架,没有进行进程、线程代码开发时,可以使用celery将一个函数在其它的线程中执行
任务task:一个耗时的函数===================>开发人员封装的函数,定义了耗时的代码
队列queue:存储任务的地方==================>redis,保存要执行的函数的名称
代理人broker:接收通知,将任务加入队列=====>调用者,任务函数.delay()
工人worker:从队列中读取任务,执行=========>新的进程
====================使用celery发短信
1.复制配置(复制)
2.自定义任务
创建包
创建tasks.py
定义函数
添加装饰器@app.task
在main.py中设置包,用于自动识别任务
3.调用
函数.delay(参数)
4.启动工人(启动celery服务)
celery -A celery_tasks.main worker -l info
在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制:
====================jwt
保持登录状态:
session
token
jwt的格式:
字符串1.字符串2.字符串3
header.payload.signature
header====>指明加密的方式{}=======>base64===>
payload===>数据库
signature=>有效性验证
====================在drf中使用jwt
1.
pip install djangorestframework-jwt
2.在配置文件settings.py中指定drf认证方式
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
3.生成token
payload=payload处理器(user)
token=encode处理器(payload)
user.token=token