Django请求生命周期和ORM
dajngo请求生命周期
django请求生命周期是:当用户在browser点击URL后,在django后台都发生了什么。
请求响应Http
1、发送Http请求
2、服务器接收,根据请求头中url在路由关系表中进行匹配(从上到下)
3、匹配成功后,执行指定的views函数
4、业务处理
原生SQL
Django ORM
---->返回给用户的结果<-----
-响应内容
响应头、响应体
请求字符串:
请求头:
FBV和CBV
URL –>函数 ---》FBV
URL –>类 ---》FBV
view.py
class CBV(View):
#根据请求头中的request method 进行自动执行 #自订制功能,扩展点
def dispatch(self, request, *args, **kwargs):
print('dispatch...')
result=super(CBV,self).dispatch(request,*args,**kwargs)
return result #返回给client def get(self,requset):
return render(requset,'index.html') def post(self,request):
return HttpResponse(request,'CBV.POST')
类,对象
“POST”
方法名=getattr(对象,‘POST’)
响应内容
request method : get
数据只放在URL,请求体为空
request method: post
请求体有内容,URL也可以传内容
创建project---app---静态文件、app注册-------配置模板路径--------配置静态文件
python manage.py startapp app01
数据库设计
数据表多对多时需要关系表
双向的一对多就是多对多
班级管理
from django.contrib import admin
from django.urls import path
from app01.views import classes urlpatterns = [
path('admin/', admin.site.urls),
path('classes.html/', classes.get_classes),
path('add_classes.html/', classes.add_classes),
path('del_classes.html/', classes.del_classes),
path('edit_classes.html/', classes.edit_classes),
]
url.py
from django.shortcuts import render , redirect
from app01 import models def get_classes(requset):
cls_list=models.Classes.objects.all()
return render(requset,"get_classes.html",{'cls_list':cls_list} ) def add_classes(request):
if request.method=="GET":
return render(request,'add_classes.html')
elif request.method=="POST":
title=request.POST.get("title")
models.Classes.objects.create(title=title)
return redirect('/classes.html') def del_classes(request):
nid = request.GET.get('nid')
models.Classes.objects.filter(id=nid).delete()
return redirect('/classes.html') def edit_classes(request):
if request.method=='GET':
nid=request.GET.get('nid')
obj=models.Classes.objects.filter(id=nid).first()
return render(request,'edit_classes.html',{'obj':obj}) elif request.method=='POST':
nid=request.GET.get('nid')
title=request.POST.get('xxoo')
models.Classes.objects.filter(id=nid).update(title=title)
return redirect('/classes.html')
classes.py
from django.db import models # Create your models here.
class Classes(models.Model):
'''
班级表
'''
title=models.CharField(max_length=32) m=models.ManyToManyField("Teachers") class Teachers(models.Model):
'''
老师表
'''
name=models.CharField(max_length=32) '''
cid tid
1 1
1 2
6 1
1000 1000 #脏数据
'''
# class C2T(models.Model):
# cid=models.ForeignKey(Classes)
# tid=models.ForeignKey(Teachers) class Student(models.Model):
username=models.CharField(max_length=32)
age=models.IntegerField()
gender=models.NullBooleanField()#可以为空的布尔值
cs=models.ForeignKey(Classes,on_delete=models.CASCADE,default="" )
models.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/add_classes.html/" method="post" >
{% csrf_token %}
<input type="text" name="title">
<input type="submit" value="提交">
</form>
</body>
</html>
add_classes.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<a href="/add_classes.html">添加</a>
</div>
<div></div>
<div>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for row in cls_list %}
<tr>
<td>
{{ row.id }}
</td>
<td>
{{ row.title }}
</td>
<td>
<a href="/del_classes.html?nid={{ row.id }}">删除</a>
|
<a href="/edit_classes.html?nid={{ row.id }}">编辑</a>
|
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
get_classes.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form method="post" action="/edit_classes.html/?nid={{ obj.id }}" >
{# ?nid={{ obj.id }}"#}
{# <input type="text" name="id" value="{{ obj.id }}" style="display: none">#}
{% csrf_token %}
<input type="text" name="xxoo" value="{{ obj.title }}" />
<input type="submit" value="提交" /> </form> </body>
</html>
edit_classes.html
学生管理
…
http协议之请求协议
http 1.1版本
connection:keep-alive
默认会话保持3000毫秒
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构
在一个端口访问另一个端口信息,属于不同源,不同源的访问不是每一次都能成功,get请求没有问题。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index,name = 'index'),
path('<int:question_id>',views.detail,name = 'detail'),
path('<int:question_id>/results/',views.results,name = 'results'),
path('<int:question_id>/vote/',views.vote,name = 'vote'),
]
url路由基础
1、在settings.py文件中有一个ROOT_URLCONF设置,设置的是在访问网址时通过哪一个url文件去匹配所请求的网址
2、path参数的使用方法path(‘blog/str:string/’) 简单了很多,就是尖括号,前边是str代表参数的类型,后面代表参数的名称
path参数类型:
捕获url中的参数需要用到尖括号<> 指定尖括号中的值类型比如int:astr:link这个转换器还有许多类型比如:
int 匹配0和正整数
str 匹配任何空字符串但不包括/
slug 可理解为注释 匹配任何ascii码包括连接线和下划线
uuid 匹配一个uuid对象(该对象必须包括破折号—,所有字母必须小写)
path 匹配所有的字符串 包括/(意思就是path前边和后边的所有)
3、url或者re_path要复杂一些 (r’^blog/(?P[0-9]{4})/′)首先需要开始符和结尾符 ') 首先需要开始符^和结尾符
′
)首先需要开始符
和
结尾符,参数匹配一个 ()就是一个匹配参数,
(?P<匹配的字段名>正则表达式)
4、进行匹配是不包括get或者post请求方式的参数及域名比如www.qq.com/blog?num=1并不会匹配?后边的字符
5、可以给request参数设置一个默认值,最常见的分页url,比如
MVC就是把web应用分为
模型(M),负责业务对象与数据库的对象(ORM),
控制器(C),接受用户的输入调用模型和视图完成用户的请求。
视图(V),负责与用户的交互(页面)
三层;他们之间以一种插件似的,松耦合的方式连接在一起。
Django的MTV模式与MVC模式没有什么差别
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
python manage.py runserver 8080
filter 自定义 installed_apps 注册 重启
filter 只能传一个参数 可以传一个列表
{#不能用在控制语句中,参数不限#}
{% simple_tag_multi 5 4 5 %}
DjangoORM操作
1、类代表数据库表
2、类的对象代指数据库的一行数据
3、FK字段代指关联表中的一行数据(类的对象)
4、 -正向:FK字段
-反向:小写类名_set---->related_name=’ss’ 一般情况不做反向查找
5、谁是主表?就全部列出其数据
models.Student.objects.all().value(‘username’,’cs_title’)
models.Classes.objects.all().value(‘title’,’ssss_username’)
6、M2M字段,自动生成第三张表:依赖关联表对第三张表间接操作
from django.db import models # Create your models here.
class Classes(models.Model):
'''
班级表
'''
title=models.CharField(max_length=32) m=models.ManyToManyField("Teachers")
# obj=Classes.objects.filter(id=1).first()
# obj.m.add(1)
#m是操作多对多关系表的桥梁
class Teachers(models.Model):
'''
老师表
'''
name=models.CharField(max_length=32) class Student(models.Model):
username=models.CharField(max_length=32)
age=models.IntegerField()
gender=models.NullBooleanField()#可以为空的布尔值
cs=models.ForeignKey(Classes,on_delete=models.CASCADE,default="" )
#cs里封装了多条数据
'''
班级:
id title
1 3班
2 4班
3 5班 老师:
id title
1 alex
2 alec
3 alev
4 aleb #增
obj=Classes.objects.filter(id=1).first()# 1 3班
obj.m.add(1)
obj.m.add(3)
obj.m.add([4,5]) obj1=Classes.objects.filter(id=2).first()# 1 4班
obj1.m.add(1)
obj1.m.add(3)
obj1.m.add([4,5]) obj=Classes.objects.filter(id=1).first()# 1 3班
#删除
obj.m.remove([3,4]) # 清空
obj.m.clear() #重置
obj.m.set([2,3,5]) #把3班的所有老师列举
obj=Classes.objects.filter(id=1).first()
obj.id
obj.title
ret=obj.m.all()
#ret是一个[]
一对多
反向查找:
Django请求生命周期和ORM的更多相关文章
- django请求生命周期,FBV和CBV,ORM拾遗,Git
一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...
- python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)
一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
- Django请求生命周期之响应内容
Django请求生命周期: 1.发送http请求2.服务器接受,根据请求头中的url在路由关系表中进行匹配(从上到下)3.匹配成功后,执行指定的views函数 URL -> 函数 ==>F ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期
Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...
- Django组件 - Django请求生命周期、中间件
一.Django请求生命周期 在学习中间件之前,先了解一下Django的请求生命周期,如下图: 1)client代表浏览器,浏览器内部为我们封装了socket,Django的WSGI模块也封装了soc ...
- Django 请求生命周期【图示】
Django 请求生命周期
- Django组件---Django请求生命周期和中间件
Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...
随机推荐
- 【443】Tweets Analysis Q&A
[Question 01] When converting Tweets info to csv file, commas in the middle of data (i.e. locati ...
- 报错:java.lang.ClassNotFoundException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
1.创建mysql_link的时候一定要注意是不是多加了空格: 2.检查Sqoop是否引入了jdbc的jar包.
- Flink 在IDEA执行时的webui
不过Flink IDEA中执行的webui 需要 flink-runtime-web 包的支持 pom 如下: <dependency> <groupId>org.apache ...
- win8(x64)下,重新安装delphi 2007时出现“Invalid Serial Number”,如何解决?
1)在添加删除程序里卸载delphi 2007 2)删除C:\ProgramData\CodeGear 3)删除C:\Program Files (x86)CodeGear 4)删除d:\Progra ...
- Django中cookie和session的操作
一.cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是 ...
- Django之用户注册
用户注册需要提交的信息包括: 用户名 邮箱 密码 确认密码 验证码 这里选择form表单提交信息,注册页面的响应函数就要分条件执行,get请求时要展示注册页面,post请求时要接收用户提交的信息,对信 ...
- nightwatch对前端做自动化测试
记录node环境使用nightwatch.selenium-server.chromedriver对部署后的前端页面进行自动化测试的项目搭建过程. 1.目标 能对部署后的前端项目进行自动化测试,能自动 ...
- java绘图(基于Graphics2D)
1.绘图基本操作 请参考下面基础示例: int width = 200, height = 250; //创建图片对象 BufferedImage image = new BufferedImage( ...
- pytorch1.0神经网络保存、提取、加载
pytorch1.0网络保存.提取.加载 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib.pyplot ...
- From 虚拟机模板 创建单节点K8S1.14.1的操作步骤
半年前总结的 还是有记不住的地方... 1. 根据上一篇blog 自己创建了一个虚拟机 里面包含 k8s1.14.1 的k8s集群 这里简单说一下 虚拟机开机之后 如何处理以能够使用k8s 的简单过程 ...