之前做过一些Django 的模块开发,毕设会从头去做一个后端,所以记录一下最开始构建的坑
- 数据库连接
当你正常创建一个项目(即startproject
),那么wsgi.py 中将会把配置文件指向settings,讲其中的DATABASES
替换为你的配置,如果是mysql或者MariaDB,配置应该像下面这样
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database',
'USER': 'root',
'PASSWORD': 'xxxxxx',
'HOST': 'xxx.xxx.xx.x',
'PORT': '3306',
},
}
如果是mysql或者MariaDB,这之后需要继续安装驱动mysqlclient ,如果是windows用户,出现了 无法打开包括文件: “mysql.h”
类似的问题,可以下载https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 进行手动安装(pip install 文件名 即可)
如果是其他的数据库,参考https://docs.djangoproject.com/zh-hans/4.1/ref/databases
- 简易的登录
Django 自带一个用户验证系统。默认情况下已经安装,并在配置完数据库后第一次migrate后生成相关的数据库表。
如何使用?主要参考
使用 Django 的验证系统 | Django 文档 | Django (djangoproject.com)
- 前后端分离的登录
很显然上述的方法很难实现前后端分离,我们需要一些别的方案
Django在做前后端分离开发的时候有一个特别强大的第三方包Django REST framework
,用于构建Web API
再加上djangorestframework-jwt插件,就可以使用了
参考
django-rest-framework-jwt的使用 – Maple_feng – 博客园 (cnblogs.com)
这之后,通过View的子类APIView调用,并设置authentication_classes即可,全局见下文
- 层级关系
又上我们得到了一个简单的登录系统,可能由于用户表等原因,已经建立了一个相关的app,django的关系可以由简单的app概括
通过命令建立app(django startapp
),并在主目录将url.py引导过来即可
注意,此时该app的模型表并没有同步,需要makemigrations和migrate
migrate默认是所有的app,如果没有,可以通过后面指定app来应用修改
python manage.py makemigrations [appname]
python manage.py migrate [appname]
如果存在一个层级关系,例如在index路径下面的xxx路径需要到index的子app
合理的作法是
from django.urls import path
from django.conf.urls import url, include
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^login/', obtain_jwt_token),
url(r'^', include('index.urls')),
]
django的include会引导这个app
此时再在index的urls.py中建立相关的引导即可
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.Index.as_view(), name='index'),
url(r'^index/xxx/', include('index.xxx.urls')) #嵌套
]
- 全局的认证设置
根据第三节的教程,我们需要在每个view中设置认证,一个更好的解决方案是进行全局的设置,在setting.py中:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
"rest_framework_jwt.authentication.JSONWebTokenAuthentication",
"index.jwtMiddleware.TokenAuth"
)
}
将需要的认证类”index.jwtMiddleware.TokenAuth”添加到下面即可
- 认证类的用户信息
根据之前的教程我们创建了认证类,对于request.user的返回教程没有做,添加user和token的返回即可
完整的文件如下:
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer
class TokenAuth:
def authenticate(self, request):
token = {"token": request.META.get('HTTP_TOKEN')}
# print(request.META.get("HTTP_TOKEN"))
valid_data = VerifyJSONWebTokenSerializer().validate(token)
print(valid_data)
user = valid_data['user']
print(user)
if user:
return user, token
else:
raise AuthenticationFailed('认证失败')
评论
eNvOPHVXS