【Django】框架梳理

教程地址:
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.pyDjango 项目的配置文件. 包含了非常重要的配置项
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.pyINSTALLED_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.pyMIDDLEWARE 配置项 里 注释掉‘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():
	插入代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值