教程地址:
https://www.bilibili.com/video/BV1AE41117Up
http://www.python3.vip/
文章目录
一、安装django包
安装命令:
>>>pip install django
使用镜像速度更快:
>>>pip install Django==2.1.3 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
注意:django版本要与python版本相匹配(自行搜索),否则后面会出现进入admin服务就断的情况
查看版本:
>>>python -m django --version
二、创建项目
cd到项目所在文件夹下,创建项目:
>>>cd/d G:\study\django\projects
>>>django-admin startproject mxsys
注意:在projects文件夹下就创建好了一个名为mxsys的项目,该目录下除了manage.py文件还有一个同名配置包。G:\study\django\projects\mxsys就是这个项目的根目录,之后的命令需要在此目录下运行
查看当前目录结构:
>>>tree/F
根目录下的文件作用:
文件 | 作用 |
---|---|
manage.py | 是一个工具脚本,用作项目管理的 |
mxsys/settings.py | Django 项目的配置文件. 包含了非常重要的配置项 |
mxsys/urls.py | 存放了 一张表, 声明了前端发过来的各种http请求,分别由哪些函数处理 |
mxsys/wsgi.py | 提供给wsgi web server调用 的接口文件,里面的变量application对应对象实现了 wsgi入口,供wsgi web server调用 。 |
settings.py
BASE_DIR | 一般是该项目的根目录,被用于在其他地方创建路径 |
SECRET_KEY | |
DEBUG | |
ALLOWED_HOSTS | |
INSTALLED_APPS | |
MIDDLEWARE | 添加地区中间件可以改变内置操作平台语言、临时注销csrf防护 |
ROOT_URLCONF | |
TEMPLATES | |
WSGI_APPLICATION | |
DATABASES | 配置数据库引擎和位置,默认是根目录下的sqlite3数据库 |
AUTH_PASSWORD_VALIDATORS | |
LANGUAGE_CODE | |
TIME_ZONE | |
USE_I18N | |
USE_L10N | |
USE_TZ | |
STATIC_URL |
三、运行服务
进入项目根目录下,运行服务:
>>>cd/d G:\study\django\projects\mxsys
>>>python manage.py runserver 0.0.0.0:80
0.0.0.0 表示绑定本机所有的IP地址,例如浏览器中输入本机地址127.0.0.1,返回成功界面
如果其他域名不能成功,就把它添加到同名配置包下的setting.py下的ALLOWED_HOSTS列表中
浏览器输入地址,显示成功界面
四、创建app
一个项目包含多个app,一个app 通常就是一个相对独立的模块 ,实现相对独立的功能
进入项目根目录下,创建app
>>>cd/d G:\study\django\projects\mxsys
>>>python manage.py startapp sales
根目录下就创建一个名为sales的文件夹,它就是一个python package
文件 | 作用 |
---|---|
migrations/ | 每次更新时,生成该app下model.py的更新脚本 |
admin.py | 将model|表注册在这里 |
apps.py | 自动创建一个继承AppConfig的应用配置类,如”CommonConfig“当创建数据库表等情况时,需要将它添加到settings.py 中 INSTALLED_APPS 中 |
modes.py | 创建继承models.Model的类,一个类就是一个数据库表 |
tests.py | |
wiews.py | 创建用于处理各种请求的可调用方法 |
五、URL路由
一级路由:
在mxsys/url.py 直接配置指向sales.view中的可调用方法
二级路由:
在mxsys/url.py先指向sales.url.py(自己新建),在sales/url.py中再指向具体方法
六、数据库和表
1.创建数据库
使用setting.py下的DATABASES的默认配置,创建一个sqlite3数据库,里面有一些基础表
>>>python manage.py migrate
2.ORM
ORM (object relational mapping):通过对象操作数据库
数据库中 | Django中 |
---|---|
创建一张数据库表 | 定义一个继承自 django.db.models.Model 的类 |
定义该表中的字段(列) | 定义该类里面的一些属性 |
对数据进行增删改查 | 定义类的方法处理数据 |
在app下的model.py创建继承django.db.models.Model的子类就是在数据库中创建表。
注意:如果model类(继承models.Model)没有objects属性,就在该类下添加 objects = models.Manager()
3.配置到数据库
定义好子类后,需要在项目的配置文件 settings.py 中, INSTALLED_APPS 配置项列表中添加该app的应用配置类’common.apps.CommonConfig’,这个应用配置类就在该app下的apps.py中定义
step1-让django检查更新这个app里面的models.py:
>>>python manage.py makemigrations app名
有更新就会在该app下的migrations文件夹生成一次更新脚本
step2-将检查的更新改变到数据库:
>>>python manage.py migrate
每次models.py更新,都需重复这两个步骤,新建的表也一定要应用到数据库,否则后续无法对表资源进行操作。
七、Admin管理数据
Django提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据。
创建超级管理员:
>>>python manage.py createsuperuser
访问http://127.0.0.1/admin/可以进入内置操作界面(英文版,如果改成中文,需要在setting的MIDDLEWARE中添加’django.middleware.locale.LocaleMiddleware’)
进入界面可以操作的默认是auth_user、auth_user_groups表
想让app下models.py定义的一个表model也在此系统中,需要将该表注册到该app的admin.py下
八、前端后端数据交互
1)非前后端分离
Django 框架在 url 路由匹配到函数后, 调用函数时,会传入 一个 HttpRequest 对象给参数变量 request,该对象里面 包含了请求的数据信息。
前端传入一个request,后端在views.py里面编写可调用方法。
一是可以直接自己定义返回前端的格式。
二是利用html模板或者模板引擎。
但是都需要处理输出格式。
2)前后端分离
定义好前端和后端交互数据的接口,后端根据接口,只负责提供数据。
九、对资源的增删改查
1)方法小结
表.objects.values()
返回QuerySet对象包含所有表记录
表.objects.create(关键字参数)
创建一条记录
表.objects.bulk_create(列表)
批量记录
表记录.属性=值
直接修改数据表记录.save()修改后需要保存
表记录.delete()
删除表记录
注意:临时取消掉CSRF的 校验机制,settings.py 中 MIDDLEWARE 配置项 里 注释掉‘django.middleware.csrf.CsrfViewMiddleware’
2)测试代码
方法一:与前端集成
开发环境下,使用前端资源测试后端代码,临时方案(正式部署Nginx)
在同名配置包下的url.py添加静态文件指向路径+ static("/", document_root="./z_dist")
方法二:使用requests库,模拟前端,发送http请求
十、登入登出
from django.contrib.auth import authenticate, login, logout
登录时获取post请求体中的用户名和密码
authenticate:可以将获取requests中的数据加密后与auth_user表里的数据验证。参数有效就返回一个User对象。
login:登入
logput:登出
十一、session和token
对于请求消息的合法性验证, 通常有两种方案: session 和 token。
使用session方案:
django_session会记录每次的登录状态(session_key唯一标识)。登陆之后每次发出http请求,响应头里面带有个set-cookie项,就是把django_session里面的记录内容返回给客户端浏览器存储,如果没有登录,那么就没有set-cookie这项。
在登录时就往session加信息,这样cookie就会带有指定信息,处理请求时就可以添加验证逻辑,验证不过就可以指定跳转。
十二、数据库表的关联
一对多:
外键需要指向关联表的主键models.ForeignKey(to,on_delete)on_delete设置当主键记录删除,关联外键的表记录如何处理:models.CASCADE\PROTECT\SET_NULL
一对一:
外键需要指向关联表的主键models.OneToOneField(),相当于外键加上unique=True 约束
多对多:
外键需要指向关联表的主键models.ManyToManyField(to,through),through参数指向两个表的中间模型表(该表将这两个表的主键指定外键成新的字段),一般情况下不需要指定,当中间表有额外的字段时需要指定
十三、ORM关联表
Country:id 、name
Student:id 、name、 grade 、country(外键指向Country)
1. 主表对象访问外键表
s1 = Student.objects.get(name='白月')
s1.country.name
主表.objects.get(表字段=值).外表名.外表字段
2. 主表对象通过外键表字段筛选记录
Student.objects.filter(country__name='中国').values('name','country__name')
主表.objects.filter(外表名__外表字段=值).values(表字段)
自动的双下划线命名方式使用不便,可以使用annotate方法进行重命名
from django.db.models import F
# annotate 可以将表字段进行别名处理
Student.objects.annotate(
countryname=F('country__name'),
studentname=F('name')
).filter(countryname='中国').values('studentname','countryname')
主表.objects.annotate( 别名1=F('外表名__外表字段'), 别名2=F('主表字段') ).filter(别名1='中国').values(别名)
3.反向访问:外键表对象访问主表(效果同2)
1.使用主表名_set
cn = Country.objects.get(name='中国')
cn.student_set.all()#cn.student_set.values('name','country__name')
外键表.objects.get(表字段=值).主表名_set.values()
2.定义反向访问名
如果不想使用主表名_set
,可以在定义表的时候定义反向访问的别名
class Student(models.Model):
name = models.CharField(max_length=100)
grade = models.PositiveSmallIntegerField()
country = models.ForeignKey(Country,
on_delete = models.PROTECT,
# 指定反向访问的名字
related_name='students')
cn = Country.objects.get(name='中国')
cn.students.all()#cn.students.values('name','country__name')
4.反向过滤:外键表对象通过主表字段筛选记录
Country.objects.filter(students__grade=1).values('name','country__name').distinct()#distinct()去重
外键表.objects.filter(反向访问名__主表字段=值).values(表字段).distinct()
同样,students__grade可以使用annotate方法定义别名
TIP:
python manage.py shell
进入交互解释器,可直接输入代码,类似jupyter notebook
写py文件再运行一样
十四、事务
添加一条订单记录,需要在2张表(Order 和 OrderMedicine )中添加记录。事务机制可以解决脏数据。
with transaction.atomic():
插入代码