在Django中通常一个功能的开发顺序为:创建应用 -> 数据库表字段设计 -> 视图函数编写 -> 应用路由 -> 全局路由 -> 测试
Django的工作流程是:
一、创建用户应用
打开 Tools > Run manage.py Task…,运行 startapp空格加应用名称
startapp user # startapp:创建应用的关键字,user:为应用的名字
生成应用后一定要记得将应用名加入到settings.py文件里名为INSTALLED_APPS的列表中,遵循规范加入到列表的最后,再添加应用也一样
# settings.py INSTALLED_APPS=[ ……, 'user', ]
应用目录详解
user ├── migrations # 存放迁移数据表的历史文件,内容自动生成 │ └── __init__.py # 一个空文件,告诉 Python 该目录是一个 Python 包。 ├── __init__.py # 一个空文件,告诉 Python 该目录是一个 Python 包。 ├── admin.py # 该应用的后台管理系统配置,这里用不到 ├── apps.py # 该应用的一些配置,这里用不到 ├── models.py # 数据模块,用来定义数据表结构 ├── tests.py # Django提供的自动化测试功能,这里用不到 └── views.py # 视图模块,代码逻辑处理的主要地点,项目中大部分代码均在这里编写
二、编写数据模型
1 #users/models.py 2 from django.db import models 3 4 from utils.base_models import BaseModel 5 6 7 class Users(BaseModel): 8 id = models.AutoField(primary_key=True, verbose_name='id主键') 9 username = models.CharField(max_length=50, unique=True, verbose_name='用户名') 10 password = models.CharField(max_length=50, verbose_name='密码') 11 email = models.EmailField(max_length=50, verbose_name='邮箱') 12 13 def __str__(self): 14 return self.username 15 16 class Meta: 17 db_table = 'lx_users' 18 verbose_name = '用户数据' 19 verbose_name_plural = verbose_name
迁移数据库,打开 Tools > Run manage.py Task…,依次行
makemigrations
migrate
注释:
……
三、编写视图函数
1 from django.http import JsonResponse 2 from django.views import View 3 4 from users.forms import RegisterForm 5 from users.generate_token import generate_jwt_token 6 from users.models import Users 7 from utils.jwt_permission_required import auth_permission_required 8 from utils.result import result 9 10 11 class LoginView(View): 12 def post(self, request): 13 json_data = request.body.decode('utf-8') 14 python_data = eval(json_data) 15 username = python_data.get('username') 16 password = python_data.get('password') 17 data = Users.objects.filter(username=username, password=password).first() 18 token = generate_jwt_token(username) 19 if data: 20 result["message"] = "登录成功" 21 result["success"] = True 22 result["details"] = {"id": data.id,"token": token} 23 return JsonResponse(result, status=200) 24 result["message"] = "登录失败" 25 result["success"] = False 26 return JsonResponse(result, status=400) 27 28 29 class RegisterView(View): 30 def post(self, request): 31 json_data = request.body.decode('utf-8') 32 python_data = eval(json_data) 33 data = RegisterForm(python_data) 34 if data.is_valid(): 35 data.cleaned_data.pop("r_password") 36 Users.objects.create(**data.cleaned_data) 37 data.cleaned_data.pop("password") 38 result["message"] = "注册成功" 39 result["success"] = True 40 result["details"] = data.cleaned_data 41 return JsonResponse(result, status=200) 42 else: 43 result["message"] = "注册失败" 44 result["success"] = False 45 result["details"] = data.errors 46 return JsonResponse(result, status=400) 47 48 49 @auth_permission_required() 50 def demo(request): 51 if request.method == 'GET': 52 return JsonResponse({"state": 1, "message": "token有效"}) 53 else: 54 return JsonResponse({"state": 0, "message": "token无效"})
四、编写应用的路由
1 from django.urls import path 2 3 from users import views 4 5 urlpatterns = [ 6 path('login', views.LoginView.as_view()), 7 path('register', views.RegisterView.as_view()), 8 path('demo', views.demo) 9 ]
五、定义全局路由
1 from django.contrib import admin 2 from django.urls import path, include 3 4 5 urlpatterns = [ 6 path('admin/', admin.site.urls), 7 path('api/user/', include("users.urls")), 8 9 ]
六、测试
1.注册接口
2.登录接口
3.token验证接口
3.1 不带token
3.2 带token