zoukankan      html  css  js  c++  java
  • Django框架--基础

    一个小问题:

    什么是根目录:就是没有路径,只有域名。url(r'^$')

    补充一张关于wsgiref模块的图

     MTV模型

    Django的MTV分别代表:

      Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM)

      Template(模板):放所有的html文件
              模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中

      View(视图):负责业务逻辑,并在适当的时候调用Model和Template

      此外,Django还有一个URL分发器。他的作用是将一个个URL的页面请求分别发给不同的Views处理,Views再调用响应的Model

    和Template。

     

     Django基本命令

    1.下载Django:

    pip3 install django

     2.创建一个Django对象

    django-admin.py  startproject  项目名
    django-admin.py  startproject    mysite

     创建成功后会生成这样一个工程。目录结构如下:

    •  manage.py --------启动文件(Django项目里面的工具,通过它可以调用Django shell的数目和数据库等)

    • settings.py -----------包含了项目的一些设置,包括数据库信息,调式标志以及其他一些工作的变量。

    • urls.py --------------路径与视图函数的映射关系

    3.创建一个应用

    python3 manage,py startapp blog(应用名称)

     创建成功后会生成这样一个工程。目录结构如下:

     4.启动Django项目

    python3 manage.py runserver  8080

     这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

     5.创建表命令

    python3 manage.py makemigrations
    
    python3 manage.py migrate

     Django生命周期

    路由层(URLS.py)

    URL配置(URLconf)就像Django所支撑网站的目录。他的本质是URL与要为该URL调用的视图函数之间的映射表;

    你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

    '''
        
        urlpatterns = [
             url(正则表达式, views视图函数,参数,别名),
    ]
    
    
    参数说明:
    
        一个正则表达式字符串
        一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
        可选的要传递给视图函数的默认参数(字典形式)
        一个可选的name参数
    
        '''

    URLconf的正则字符串参数

    1.简单配置

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    ]

    注意几点:

    '''
        NOTE:
    1、一旦匹配成功则不再继续
    2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
    3、不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4、每个正则表达式前面的'r' 是可选的但是建议加上。
    
    一些请求的例子:
    
        /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
        /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
        /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                           views.month_archive(request, '2005', '03')。
        '''
    #设置项是否开启URL访问地址后面不为/跳转至带有/的路径
    APPEND_SLASH=True

     无名分组和有名分组

    上面的示例使用简单的,没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数传递给视图。在更高级的用法中,可以使用命名的这则表达式组来捕获URL

    中的值并以关键字 参数 传递给视图。

    在Python正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。

    from app01 import views
    from django.conf.urls import url
    
    urlpatterns = [
          #无名分组
          url(r'^article/d{4}',views.year),
          url(r'r^article/(d{4})$',views.year2),
          #如果有多个匹配一样的时候,谁放在上面就匹配谁,上面的就会把下面的覆盖了正则加上括号,就是分组,会把分组的内容作为year2函数的位置参数传进去
          url(r'^article/(d{4})/(d{2})$',views.year_month),
         
          #有名分组(就是给分组起个名字,这样定义的好处就是按照关键字参数去传参了,指名道姓的方式)
          url(r'^article/(?P<year>d{4})/(?P<month>d{2})$',views.year_month_hasname)
      
    ]

     无名有名不能混合使用

    捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

    URL :  /articles/2005/03
        
    请求将调用 views.year_month_hasname(request,year='2005',month='03')函数

    在实际应用中,这就意味着你的URLconf会更加明晰且不容易产生参数顺序问题的错误----你可以在你的视图函数定义中重新安排参数的顺序。

    当然,这些好处是以简洁为代价;有些开发人员认为命名组语法丑陋而繁琐。

    反向解析(详情请看另篇文章)

    本质:其实就是给你返回一个能够对应url的地址,通过这个地址匹配相应的视图函数

    1.先给url和视图函数对应关系起别名

    url(r'^index/$',views.index,name='kkk')

    2.反向解析

      后端反向解析

        后端可以在任意位置通过reverse反向解析出对应的url

        from django.shortcuts import render,HttpResponse,redirect,reverse

        reverse('kkk')   

      前端反向解析

        {% url 'kkk' %}

    3.无名分组反向解析

      url(r'^index(d+)/$',views.index,name='kkk')

      后端反向解析

        reverse('kkk',args=(1,))    后面的数字通常都是数据的id值

      前端反向解析
        {% url 'kkk'  1%}  后面的数字通常都是数据的Id值

    4.有名分组反向解析

      同无名分组反向解析意义的用法

      url(r'^index/(?P<year>d+)/$',views.index,name='kkk')

      后端方向解析

        print(reverse('kkk',args=(1,)))   推荐你使用上面这种  减少你的脑容量消耗

        print(reverse('kkk',kwargs={'year':1}))

      前端反向解析

        <a href="{% url 'kkk' 1 %}">  推荐你使用上面这种 减少脑容量

        <a href="{% url 'kkk' year=1 %}">

    注意:在同一应用下  别名千万不能重复!!!

    路由分发

      当你的django项目特别庞大的时候  路由与视图函数对应关系特别特别多。那么你的总路由url,py代码太过冗长,不容易维护。

      每一个应用都可以有自己的urls.py , static文件夹,templates文件夹

      正是基于上述条件  可以实现多人分组开发 等多人开发完成之后  我们只需要创建一个空的django项目

      然后将多人开发的app全部注册进来  在总路由实现一个路由分发  而不再做路由匹配

      当你的应用下的视图函数特别特别多的时候  你可以建一个views文件夹  里面根据功能的细分再建不同的py文件

      

      总路由

          项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发

     #路由分发  注意路由分发总路由千万不要$结尾
       from django.conf.urls import include
     urlpatterns=[
         url(r'^admin/',admin.site.urls),
         url(r'^app01/',include('app01.urls'))
        ]
    
    #z在应用下新建urls.py文件 ,在该文件内写路由与视图函数的对应关系即可
    from django.conf.urls import url
    from app01 import views
    
    urlpatterns=[
         url(r'^index/',views.index)   
    ]

    在起别名的时候前缀加上 app0X_index,能够解决名称空间混乱问题

    名称空间(了解)

    url(r'^app01/',include(app01_urls,namespace='app01')),
            url(r'^app02/',include(app02_urls,namespace='app02'))  #可以不用这种方式,直接在起别名的时候加上前缀name=app01_index
        app01.urls.py
            from django.conf.urls import url
            from app01 import views
            urlpatterns = [
                url(r'^index/',views.index,name='index') #name='app01_index'
            ]
        
        app02.urls.py
            from django.conf.urls import url
            from app02 import views
            urlpatterns = [
                url(r'^index/',views.index,name='index')
            ]
        
        app01.views.py
        reverse('app01:index')
        
        app02.views.py
        reverse('app02:index')

    伪静态网页

      静态网页:数据是写死的 万年不变

      伪静态网页的设计是为了增加百度等搜索引擎seo查询力度

    url(r'^index.html',views.index,name='app01_index')

    视图层(views.py)  

    FBV与CBV

    FBV:基于函数的视图  ,我们之前一直写的def 

    CBV:基于类的视图

    #urls.py 路由层
    urlpatterns = [  
        #url(r'^mycls/',views.view)  这个根据父类View 里面的类绑定方法得到,具体看父类源码
         url(r'^mycls/',views.MyCls.as_view())
        ]
    
    #views.py 视图层
    class MyCls(View):
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            return HttpResponse('post')

       

     

      

    万般皆下品,唯有读书高!
  • 相关阅读:
    18.中介者模式
    17.迭代器模式
    16.解释器模式
    15.命令模式
    Git超详细用法,通俗易懂
    CSS Sprites精灵图(雪碧图)
    小程序被冻结,忘记原始ID,如何找回?
    vue组件-视频播放之video.js
    基础设计模式-04 复杂对象创建的建造器模式
    基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11528645.html
Copyright © 2011-2022 走看看