之前做过一些Django 的模块开发,毕设会从头去做一个后端,所以记录一下最开始构建的坑

  1. 数据库连接

当你正常创建一个项目(即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

  1. 简易的登录

Django 自带一个用户验证系统。默认情况下已经安装,并在配置完数据库后第一次migrate后生成相关的数据库表。

如何使用?主要参考

使用 Django 的验证系统 | Django 文档 | Django (djangoproject.com)

  1. 前后端分离的登录

很显然上述的方法很难实现前后端分离,我们需要一些别的方案

Django在做前后端分离开发的时候有一个特别强大的第三方包Django REST framework,用于构建Web API

再加上djangorestframework-jwt插件,就可以使用了

参考

django-rest-framework-jwt的使用 – Maple_feng – 博客园 (cnblogs.com)

这之后,通过View的子类APIView调用,并设置authentication_classes即可,全局见下文

  1. 层级关系

又上我们得到了一个简单的登录系统,可能由于用户表等原因,已经建立了一个相关的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'))	#嵌套
]
  1. 全局的认证设置

根据第三节的教程,我们需要在每个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”添加到下面即可

  1. 认证类的用户信息

根据之前的教程我们创建了认证类,对于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('认证失败')