Introduction
开源web应用框架,由python开发
MVC设计典范,一种业务逻辑,数据,界面显示分离的方法组织代码。核心思想解耦,
Model:逻辑部分,通常负责在数据库中取数据
View:处理数据显示的部分
Controller: 处理用户交互的部分,
MTV:
Model:负责业务对象和数据库对象(ORM)
Template: 一个html页面
View: 相当于MVC里的Controller, 负责业务逻辑和在设当的时候调用Model和Template
Python三大主流web框架
django, flask, tornado
django
自带的组件和功能非常多,socket部分默认使用wsgiref
flask
自带组件少,依赖于三方组件
socket部分使用werkzeug
模板语法使用jinja2
Tornado
异步非阻塞
socket, 路由匹配和模板语法都是Tornado自己实现的
安装
1.11.4 2.0, 2.1 可适配 python 3.6
pip install Django==1.11.4
初步使用
创建项目
django-admin startproject project
three . /F
项目目录说明
manage.py 一个命令行工具,可以使我们用多种方式对Django项目进行交互
project目录:
__init__.py
是一个空文件
settings.py 是项目配置文件
urls.py 是项目的URL声明
wsgi.py 是项目与WSGI兼容的Web服务器入口
应用目录说明
migrations/, 所有数据库相关的操作
admin.py, 后台管理
apps.py, 注册apps使用
tests.py, 测试代码使用
views.py 处理业务逻辑
基本操作
配置数据库
在settings.py文件中,通过DATABASES选项配置
ENGINE: django.db.backends.mysql
NAME: database_name
USER:
PASSWORD:
HOST:
PORT:"3306"
在__init__.py
里写入
import pymysql
pymysql.install_as_MySQLdb()
创建项目
在一个项目中可以创建多个应用,每个应用运行一种业务逻辑
python manage.py startapp app_name
项目目录说明:
__init__.py
admin.py #
models.py
views.py
激活应用
settings.py 将应用名加入到INSTALLED_APPS选项中
模型
由一个数据表,就对应由一个模型
在models.py文件中定义模型
from django.db import models
class MyModels(models.Model):
name = models.CharFiled(max_length=20)
score = models.IntegerField()
# 类中的属性对应表中的字段
def __str__(self):
return f"{self.name}"
说明:不需要定义主键,在生成时自动添加,并且值为自动增加的
数据库支持
Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的接口
ORM
对象关系映射
任务:根据对象的类型生成表结构,将类对象,列表的操作转换为sql语句,将sql查询到的结果转为对象,列表
优点:极大减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码
数据库迁移
-
生成迁移文件
python manage.py makemigrations
-
执行迁移
python manage.py migrate # 执行迁移
定义模型
定义属性
如果手动设置主键后,则django不会再生成默认主键列
不允许使用连续下划线
字段类型:
.AutoField # 自动增长的主键
.CharField # 字符串
.TestField # 长文本,大于3000
.IntegerFiled # 整数类型
.DecimalField # 小数
.BooleanField
.FloatField
.DateField
.TimeField
.DateTimeField
.FileField # 一个上传文件的字段
字段选项
db_column # 设置字段名称
primary_key=True
unique=True
关系
.ForeignKey: 一对多
元选项
在模型类中定义Meta类,用于设置元信息
class TestClass:
...
class Meta:
db_table="xxx" # 定义数据表名,推荐使用小写字母,默认项目名小写_表名
ordering=[] # 对象的默认排序字段,获取对象列表时使用
模型成员
类属性:objects, 时Manager类型,作用是与数据库进行交互
当定义模型类时没有制定管理器,则Django为模型创建一个名为objects的管理器
可以自定义管理器
自定义管理器Manager类
模型管理器时Django的模型与数据库交换的接口,
作用:向管理器类中添加额外的方法,修改管理器返回的原始查询集,重写get_queryset()方法
创建对象
目的:向数据库中添加数据,注意__init__
方法已经在父类中,在自定义的模型中无法使用
方法: 1. 在模型类中增加一个类方法,2.在自定义的管理器添加一个额外的方法
models.User.objects.create(username=xxx, password=xxx) # 创建对象后,会直接写入数据库
模型查询
查询集:表示从数据库获取的对象集合,
查询集可以有多个过滤器
查询集
- 在管理器上调用过滤器返回新的查询集
- 惰性执行
- 直接访问数据的情况:迭代和序列化,与if合用
- 返回查询结果的方法的过滤器:all(), filter(key=value, key2=value2), exclude(), oder_by(), values(),
- 返回单个数据,get()没找到或找到多条数据都会引发异常, count()返回查询集合结果数量, first(), last(), exists()
查询集的缓存
字段查询
比较运算符,聚合函数,F对象,Q对象
语法
属性名称__比较运算符=值
外键
属性名__id
转义
类似like语句中使用%是为了匹配占位,如果要匹配%号
比较运算符
- exact: 判断,大小写敏感
- contains:是否包含,大小写敏感
- startswith, endswith
- 以上如果在前面加i, 表示不区分大小写
- isnull, isnotnull
- in
- gt, gte, lt, lte
- year, month, day, hore, minute,
- 跨关联查询
- 查询快捷:pk
聚合函数
-
使用aggregate函数返回聚合函数的值
-
Avg
-
Count
-
Max
.aggregate(Max("age"))
F对象
可以使用模型的A属性和B属性作比较
filter(xx_gt=F("xxx"))
支持F对象的算术运算
Q对象
过滤器的方法中的关键字参数,条件为And模式,Q对象可以用来进行or查询
Q() | Q()
~Q() | Q() # ~表示取反
限制查询集
返回集是列表,可以用下标限制访问
数据操作
python manage.py shell
from myApp.models import TestClass
from django.utils import timezone
TestClass.objects.all() # 查看所有数据
test_obj = TestClass() # 创建空的对象
test_obj.name = "test"
test_obj.save() # 保存信息到数据库
g = TestClass.objects.get(pk=2) # pk is id
g.delete() # 从数据库中删除数据
test_obj.field = other_obj # 关联对象
other_obj.TestClass_set.all() # 反向获取关联对象
stu = grade1.students_set.create(name="test") # 不用先实例化学生对象,然后再关联班级。直接一步执行,保存到数据库
启动服务器
格式
python manage.py runserver ip:port
# ip 不写代表本机IP, 端口号默认8000
# 这是一个纯python写的轻量级服务器,仅仅在开发测试中使用
Admin站点管理
概述
内容发布
负责添加,修改,删除内容
公告访问
配置
在setting.py文件中的INSTALLED_APPS添加django.contrib.admin
创建管理员用户:
python manage.py createsuperuser
修改admin.py文件
from .models import TestClass
admin.site.register(TestClass)
自定义管理页面
# admin.py 文件
class TestClassAdmin(admin.ModelAdmin):
list_display = ['pk', 'name'] # 显示字段
list_filter = [] # 添加过滤器
search_fields = [] # 添加搜索字段
list_per_page = []
# 添加,修改页属性
fields = [] # 规定属性的先后顺序
fieldsets = [] # 给属性分组, 与fields不能同时使用
关联对象
class ToBeLinkedClass(admin.TabularInline):
model = Students
extra = 2
布尔值显示问题
class TestClassAdmin(admin.ModelAdmin):
def gender(self):
if self.gender = True:
return "male"
else:
return "Female"
gender.short_description= "gender"
action_on_bottom = True # 执行动作显示位置
使用装饰器完成注册
视图
在django中,视图对web请求进行回应。视图就是一个python函数,在views.py中设置函数,响应:网页,重定向,错误视图(404, 500),JSON数据
from django.http import HttpResponse
def index(request):
return HttpResponse("test view")
配置URL
修改project目录下的urls.py文件,制定根级urls(settings.py文件中的ROOT_URLCONF)
urlpatterns = [
url("patterns")
] # url实例的列表
在myApp应用目录下创建
一个urls.py文件
from. import views
from django.conf.urls import url
urlpatterns = [
url(r"^$]
url匹配注意事项:如果要获取url中的值,要在正则中加括号;匹配正则前面不需要反斜杠;
引入其他url配置
在应用中创建urls.py, 在工程urls.py文件使用include()
url的反向解析
如果在视图,模板中使用了硬编码的链接,url匹配发生改变时,动态生成链接地址
视图函数
参数:request, 通过正则表达式获得的参数
一般在views.py文件中定义
错误视图
-
404:url匹配不成功,在templates目录下定义404.html,参数request_path
配置setting.py, DEBUG:如果为True, 永远不会调用404, ALLOWED...
-
500: 服务端错误
-
500:
-
400: 客户端出现在客户的操作
HttpResponse对象
给浏览器返回数据,HttpResponse是由程序员创建
用法:
- 不调用模板
- 调用模板,使用render方法
- 原型,render(request, templateName, [, context])
- 作用,结合数据和模板,返回一个完整的HTML页面
- 参数:
- request:请求体对象
- templateName:模板名称
- context: 需要渲染在模板上的数据
属性:
-
content:表示返回的内容
-
charset:
-
status_code:
-
content-Type:制定输出的MIM
方法:
- init
- write
- flush:以文件的形式输出缓冲区
- set_cookie
- delete_cookie
子类HttpResponseRedirect, 可以重定向,服务器端的跳转
子类JsonResponse,异步请求,Ajax, data:字典对象, content-type:application/json
HttpRequest对象
服务器接收http请求后,会根据报文创建一个HttpRequest对象,传递给视图的第一个参数
属性:
- path: 请求的完成路径,不包含域名和端口
- method:请求的方式:GET, POST
- encoding: 表示浏览器提交的数据的编码方式
- GET:类似于字典的对象,包含了get请求的所有参数
- POST:类似于字典的对象,包含了POST请求的所有参数
- FILES:类似于字典的对象,包含了所有上传的文件
- COOKIES:就是字典,包含所有的cookie
- session:类似字典的对象,包是当前会话
方法
- is_ajax(): 如果是通过XMLHttpRequest发起的
QueryDict对象
包括GET,POST,
方法:get(),根据键获取值, 返回列表最后一个元素;getlist()将键的值以列表形式返回
状态保持
http协议是无状态的,每一次请求都是新的请求,实现状态的保持,在客户端或者服务端存储有关会话的数据
存储方式:
- cookie: 所有数据存储在客户端,不要存储敏感的数据
- session:所有的数据存储在服务端,在客户端存储用cookie存储session_id
目的:在一段时间内,跟踪请求者的状态
注意:不同的请求者不会共享这个数据
启用sessiong, 在setting.py文件中设置,默认是启用的
每个HttpRequest对象都有一个session属性,它就是一个类似字典的对象
方法:get(key), clear(), flush()删除当前的会话,并删除会话的cookie
request.session['username'] = username
username = request.session["username"]
render(request, {"username":username})
from django.contrib.auth import logout
# 清除session
设置过期时间:
set_exprity(value), value是整数,单位秒;或者时间对象,或者0(关闭浏览器时失效)
模板
模板时HTML页面,可以根据视图中传入的数据进行填充
创建模板
templates/myApp1
模板语法
变量
要遵守标识符规则,如果使用的变量不存在则插入的是空字符串
如果调用方法,但不能传入参数
{{输出值,可以时变量,可以是对象.属性}}
{{%执行代码%}}
{%for num in item_num%}