Django请求生命周期和ORM

dajngo请求生命周期

django请求生命周期是:当用户在browser点击URL后,在django后台都发生了什么。

请求响应Http

1、发送Http请求

2、服务器接收,根据请求头中url在路由关系表中进行匹配(从上到下)

3、匹配成功后,执行指定的views函数

  • URL –>函数 ---》FBV
  • URL –>类     ---》FBV
  • 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是一个[]

    一对多

    反向查找:

    原文地址:https://www.cnblogs.com/bind/p/11663225.html

    时间: 2024-10-31 20:49:11

    Django请求生命周期和ORM的相关文章

    DJANGO入门系列之(Django请求生命周期and路由层)

    昨日回顾 1 orm 创建表,新增字段,修改,删除字段,不能创建数据库 -字段属性phone=models.CharField(max_length=64,null=True) -null=True 代表该列可以为空 2 数据的增删改查 -增(1):User.objects.create(address='') -增(2):实例化产生一个user对象,user对象的save方法 -删:User.objects.filter(id=1,name='lqz').first().delete() -删

    Django请求生命周期之响应内容

    Django请求生命周期: 1.发送http请求2.服务器接受,根据请求头中的url在路由关系表中进行匹配(从上到下)3.匹配成功后,执行指定的views函数 URL -> 函数 ==>FBV URL -> 类 ==>CBV4.业务处理 - 根据个人需求自定 - 操作数据库 - 原生SQL - Django ORM ==> 返回给用户的结果 <== - 响应内容 - 响应头 - 响应体 原文地址:https://www.cnblogs.com/ray-h/p/10241

    Django请求生命周期

    1. Django请求生命周期的概念 用户在浏览器上输入url连接到看都页面的时间内, Django后台发生的事 2. Django请求生命周期的基本概述 1. 文字描述 第一步:浏览器发起请求 第二步:WSGI创建socket服务端,接收请求(Httprequest) 第三步:中间件处理请求 第四步:url路由,根据当前请求的URL找到视图函数 第五步:view视图,进行业务处理(ORM处理数据,从数据库取到数据返回给view视图:view视图将数据渲染到template模板:将数据返回) 第

    Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块

    django请求生命周期流程图 djang中间件 它是django的门户 只要是全局相关的功能你都应该考虑使用django中间件来帮你完成 全局用户身份校验 全局用户访问频率校验 用户访问黑名单 用户访问白名单 # 只要以后用django开发业务 设计到全局相关的功能 你就考虑用中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Sessio

    Django请求生命周期之CBV扩展

    dispatch找类和method字符串 原文地址:https://www.cnblogs.com/jintian/p/11167399.html

    Django请求生命周期之Http请求

    原文地址:https://www.cnblogs.com/jintian/p/11167377.html

    面试-Django框架请求生命周期

    先看一张图吧! 1.请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf.request.session - 路由匹配 - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm.templates => 渲染 - 中间件,对响应的数据进行处理. - wsgi,将响应的内容发送给浏览器. 2.什么wsgi wsgi:

    Django的请求生命周期

    Django的请求生命周期: 1.当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 2.服务端的wsgiref模块接收用户请求并将请求进行初次封装,然后将请求交给Django的中间件 3.通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数 4.视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面 5.视图函数将响应的页面依次通过中间件反馈给客户端 原文地址:https://www.cnblogs.com/Ming-Hui/p/93481

    Django的请求生命周期与中间件中的5中方法

    请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form django.utils. deprecation import MiddlaraMixin 5种方法与4个要点:执行顺序,执行时间,参数,返回值 方法:process_request process_views process_exception process_response process_template_r