助教:
Java
性能更好
主流大型项目框架
Entity层,controller层,service层,mapper层
sql,数据库基本知识要会
Python
代码简洁,适合快速开发小型项目
语言学习成本低,框架学习成本低,接口逻辑仅在view.py实现
本教程以更好上手的django框架进行讲解,大家依据自己的基础去选择后端框架
Pycharm,vscode…
Pycharm下载: https://www.jetbrains.com.cn/pycharm/
申请教育优惠,BUAAer免费使用
不要选择community版本,选择professional版本
相比于直接安装 Python 某个版本,更推荐安装 Anaconda 管理虚拟环境。Python 项目的版本和依赖各有千秋,而使用 Anaconda 能针对项目建立虚拟环境,互不干扰且便于管理。
Anaconda下载地址:
官网: https://www.anaconda.com/
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/(选择最新版本即可)
Windows-x86.exe
⚠️ 安装步骤中注意勾选添加至环境变量中
创建django环境:
安装 Anaconda 后,使用 conda 指令新建一个虚拟环境,用于开发 Django 项目–打开Anaconda prompt黑窗,分别输入:
conda create --name django python=3.8
conda activate django
看到变为(django)开头则成功:
打开pycharm:File->new Project
创建后运行,如果终端如下则创建成功,后端项目运行在http://127.0.0.1:8000/
创建后运行,会看到djangoProject文件夹和user文件夹,user文件夹就是一个项目app
终端输入:python manage.py startapp app名
(仅作为展示,不需要跟着我创建)
此时会看到目录里多出test1文件夹
现在就需要在djangoProject/settings.py install_app
中写创建的app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'test1',
]
⚠️user是创建项目时就新建的app,user.apps.UserConfig
就是user的配置,不要再写
press
|-- djangoProject # app目录
| |-- __init__.py # python包声明
| |-- admin.py
| |-- apps.py # app配置文件
| |-- models.py # 数据库模型配置
| |-- tests.py # 测试模块
| `-- views.py # 视图编写文件(API-实现业务逻辑,响应前端的请求)
|-- user
| |-- __init__.py
| |-- asgi.py
| |-- settings.py # 项目配置文件
| |-- urls.py # 后端路由设置
| `-- wsgi.py # uwsgi运行入口
|-- manage.py # django命令行工具
`-- db.sqlite3 # 数据库文件
user /models.py:
数据库模型设置,在这里要建立数据库表项及其属性
user /views.py:
编写api的文件,在这里要编写和规划所有的请求处理函数
djangoProject /settings.py:
项目总配置文件,在这里实现跨域设置、app信息等
djangoProject /urls.py:
后端路由设置,在这里指定后端API的路由,以供前端发送请求
一个项目通常是包含多个app的,每个app中会实现多个接口,产生多个请求地址, 所有api 的路由都在一个文件中(djangoProject /urls.py)添加是不合适的。 因此,可以在各 app 下新建 urls.py 文件,并在总的路由文件中指定包含这些文件。具体操作请看下面:
首先,在 app(user目录) 下新建 urls.py
文件,内容如下:
# app/urls.py
from django.urls import path
from .views import *
urlpatterns = [
# path('url_name', api_name)
# 这是一个样例,指定路由名为url_name,对应处理函数为当前app内views.py中的api_name
]
接着在项目配置目录(djangoProject目录)的 urls.py
引入上面文件的路由:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include(('user.urls', 'user'))),
]
上述操作实现了将 user 这个 app 指定的 urls,全部接到了路由 user/
之后。
假设要开发一个注册功能,用户可以使用用户名和密码进行注册;用户名要求唯一。
user/models.py
models.py文件中存放数据库的结构,包含数据库的字段和字段属性
from django.db import models
# Create your models here.
class user(models.Model):
username = models.CharField(max_length=100)
password = models.CharField(max_length=20)
⚠️注意,在每次修改数据库模型之后, ❗️ 都要生成迁移文件,并应用新的数据库模型。
在终端依次输入如下命令:
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 迁移数据库模型
输入上述命令迁移后运行,可以发现在项目根目录出现了 db.sqlite3
文件。这是一个数据库文件。
选看:
Django 的 Model 数据类型
数据类型 说明 AutoField 根据 ID 自增长的 IntegerField 字段,通常用于主键ID IntegerField 32位整数,可自定义选项 BooleanField 布尔值(True/False)字段 CharField 字符串字段,对小字符串和大字符串都适用;对于大量文本建议使用TextField。必须参数:max_length(字段的最大字符数) DateField 利用 Python 的 datetime.date 实例来表示日期 DateTimeField 利用 datetime.datetime 实例表示日期和时间 EmailField 带有 email 合法性检测的CharField,默认max_length=75 TextField 超大文本字段 FileField 文件字段 ImageField 继承于FileField,确保是有效图片 字段参数
参数 说明 null 是否允许为空值,默认为false default 该属性的默认值 primary_key 该属性是否为主键,默认为false unique 该属性的值是否唯一,默认为false
众所周知,Jetbrain拥有世界一流的产品(
pycharm内置数据库可视化
可以将目录db.sqlite3
进行可视化,也就是你写在models.py
里的内容
首先点右侧栏Database-> 点击Database窗口左上角➕ -> 点击Data Source -> 选择SQLite
File选择项目目录下db.sqlite3
文件,左下角若显示需要安装驱动,点击安装即可
最后点击Test Connection
,出现✔️即代表准备就绪,点击APPLY
,然后OK
退出
此时再点击Database,在目录中就可以看到一对表,找到在models.py
中定义的表名,点开即可看到
user/view.py
完成一个业务功能的实现,一般分为两步:编写业务逻辑处理函数,指定路由。
先实现业务逻辑,在 user/views.py
中编写函数
@csrf_exempt # 跨域设置
def register(request): # 继承请求类
if request.method == 'POST': # 判断请求方式是否为 POST (此处暂时要求一定是POST)
username = request.POST.get('username') # 获取请求体中的请求数据
password = request.POST.get('password')
tmp_user = user.objects.filter(username=username) # 数据库查询相同username的user
if len(tmp_user) != 0: # 若存在相同用户名,则返回错误码errno和描述信息msg
return JsonResponse({'errno': 1002, 'msg': '用户名重复'})
else:
# 新建 Author 对象,赋值用户名和密码并保存
new_user = user(username=username, password=password)
new_user.save() #save()方法数据存入数据库
#返回使用Json格式返回体
return JsonResponse({'errno': 0, 'msg': '注册成功'})
else:
return JsonResponse({'errno': 1001, 'msg': '请求方式错误'})
网页的四种请求方式:
请求方式 特征 GET 从服务器取出资源(一项或多项) POST 在服务器新建一个资源 PUT 在服务器更新资源(客户端提供改变后的完整资源) PATCH 在服务器更新资源(客户端提供改变的属性) DELETE 从服务器删除资源
POST请求,数据存放在请求体中
请求体,是json格式的数据结构,实际上就是字典,非常常见于web前后端请求
{
"errno": 1002,
"msg": "用户名重复"
}
{
"username": "fish",
"password": "12345"
}
增
# 方法一
user = User()
user.name = "fish"
user.save()
# 方法二
user = User(id=1, name="fish")
user.save()
# 方法三
User.objects.create(id=1, name="fish")
查
# 查询特定结果
user = User.objects.get(id=1)
# 查看多个结果(返回一个列表)
users = User.objects.filter(kind='学生')
# 查询全部结果
users = User.objects.all()
改
# 方法一:查后改后保存
user = User.objects.get(id=1)
user.name = "fish"
user.save()
# 方法二:更新
users = User.objects.filter(kind="学生")
users.update(kind="老师")
删
user = User.objects.get(id=1)
user.delete()
在之前创建的user/urls.py
中添加:
from django.urls import path
from .views import *
urlpatterns = [
path('register', register), # 指定register函数的路由为register
]
前后端分离开发中,仅后端一般无法通过点击图形化界面进行测试,后端的测试也不应该依赖于前端,而应该独立进行。因此后端的测试,需要借助工具模拟前端请求,向后端相应的路由发送请求,并查看响应数据。
Postman是一个非常好用的一个工具,用于向后端发送路由请求
Postman 下载地址: https://www.postman.com/
可以看到正常的Json数据返回,证明注册api实现成功
示例:
可以看到返回
{
"errno": 0,
"msg": "注册成功"
}
返回项目数据库,可以看到增加了fish3,12345_3
一行数据
postman测试只能知道某个api是否有报错,当报错之后,不知道api中哪里出错了,可以debug运行,或者print大法,依据实际情况检查程序bug,相信大家在程序设计和数据结构课中已经掌握了纯熟的debug技巧(笑
到这里相信大家已经基本入门了django后端框架,祝大家开发愉快