DjangoURLS路由

一、相约Django。

  1、Django的特点:Django定义了服务分布、路由映射、模板编程、数据处理的一套完整的功能。

    (1)集成数据访问组件:Django的model层自带数据库ORM组件。

    (2)URL映射:Django使用正则表达式管理URL映射。

    (3)后台管理系统自动生成。

  2、Django的结构:Django遵循MVC架构的web开发框架。

    (1)管理工具management:内置的创建站点、迁移数据、维护静态文件的命令工具。

    (2)模型model:提供数据访问接口和模块。包括数据字、元数据、数据关系等。

    (3)视图view:Django的视图层封装了HTTP request和response的一系列操作和数据流。主要是URL映射机制和绑定模板。

    (4)模板temlate:一套Django自己的页面渲染模板语言,用内置的tags和filters定义页面的生成方式。

    (5)表单form:通过内置的数据类型和控制组件生成HTML表单。

    (6)管理站admin:通过声明需要管理的model,快速生成后台数据管理网站。

二、安装Django。

  Mac和Linux使用命令安装:

  Win安装:如果你还未安装Python环境需要先下载Python安装包。

    1、Python 下载地址:https://www.python.org/downloads/

    2、Django 下载地址:https://www.djangoproject.com/download/

  注意:目前Django 1.6.x以上版本已经完全兼容Python 3.x。

  Python 安装(已安装的可跳过):

    安装Python你只需要下载python-x.x.x.msi文件,然后一直点击"Next"按钮即可。

    安装完成后你需要设置Python环境变量。 右击计算机->属性->高级->环境变量->修改系统变量path,添加Python安装地址,实例使用的是C:\Python33,你

  需要根据你实际情况来安装。

三、组建第一个project。

  1、创建project。

  (1)字符终端Termiral下可以使用命令:django-admin startproject XXOO(XXOO为项目名,看心情随意起)。

  (2)创建成功后,切到项目名的路径下:cd XXOO

      在正规军的当前目录中建立了一个子目录正规军,并在其中生成了Django开发的默认文件。

   正规军/

    manage.py :是Django用于管理本项目的命令行工具,进行站点运行,数据库自动生成、静态文件收集。

    正规军/ :内层的正规军目录中,包含了本次项目的实际文件。因为有__init__.py,所有这是一个Python包。

      __init__.py

      settings.py : 是Django项目的配置文件,其中定义了该项目引用的Django组件和Django项目名。

      urls.py : 是维护项目的URL路由映射,即定义客户端访问的URL由哪一个Python模块解释并提供反馈。默认是定义admin为管理员站点的解释器。

      wsqi.py : 定义WSGI的接口信息,用于与其他web服务器集成。

                         

 

  2、创建应用:

  (1)命令创建包名:python manage.py startapp XO(XO为包名,也就是应用包) 。

      写多个包app是为了功能划分,分开不同的业务线。

      该包的功能是实现具体的某些功能。例如:admin-------是Django自带的后台管理的相关配置。

                         model-------是根据类创建的数据库表,是写类的。

                         test---------是进行单元测试的。

                         views(视图)---这个包的函数,该包或该业务相关的具体的功能基本上都写在这。

                         migration-----数据库相关所使用的。

  (2)views中的内容可以形成一个包,将views中的具体功能函数每一个都单独写。在使用中,可以去views中调用方法即可,可以对业务进行更细的划分。

  3、

Django知识点概括:

    

 四、Django视图层:作用是衔接HTTP请求,Python程序,HTML模板

  1、路由系统URL:本质是使URL和函数对应上关系。

  (1)一一对应(静态路由):为一个URL对应一个相应的函数

    /login/ ----> def login()

    一个login对应一个login函数

  (2)URL后可以跟正则表达式(动态路由):(位置)

    /login/(\正则表达式) /-----> 对应函数def

    login/(\w+)/ ------> 这时的视图函数不能以get收数据,而是以参数的形式接受 下面的a1就是那个参数。有多少个正则,就多少个a ~,并且是按顺序接收  ^_^ !

                  def XXOO(request,a1):

                    print(a1)

                    return HttpResponse('......')

       (\W+)取代了之前的?nid=XXXXX,这样起到了SEO的优化,提高页面的权重

  (3)URL中的正则表达多,传递的参数多,可以对传参进行编号。(可命名)

    /add—user/(?P<a1\d+)/ ----->  def add_user(request,a1)

                        在正则前加上 ?P<a1> 的意思是在视图函数中,找参数时,及时aXXXX是无序的,也会按照a后的号码进行查找参数。

    【1】终止符:在URL中加“/”或终止符$

    【2】伪静态:edit/(\w+).html 其中.html 就是伪静态。

      伪静态:静态网址的访问速度高于动态网址,而伪静态就是将动态网址伪装成静态网址,提高访问权重。加快访问响应。

    2、3在函数中都可用*args **kwargs 取代位置参数和可命名的参数,但是在url中也要统一用法。

  (4)路由分发:(可以设置默认页面)

    在与项目名相同包名的url文件中,加入Django.conf.urls 中导入的include方法,在URL中写出指定的应用包名。例如app1,在使用include方法是项目包中的URL定位到app01的url并与app01中的URL相关联,

    url(r'^app01/', include('app01.urls')),

    它的流程是在项目中的URL中匹配出app01的url,再在app01的URL中匹配出对应URL的函数去执行。 

    可以指定URL,当访问的URL不存在时,可以使其跳转到指定的页面

    在项目包的URL中:

      from django.shortcuts import HttpResponse  

      def default(request):

          return HttpResponse('.......')

      在URL中:url(r'', default),    就可以了。

       也可以使app01的错误页面跳转到指定的页面

       url(r' ', include('app01.url.index')),    ,就可以了。         

  (5)根据名称反向生成URL:(给URL定义一个名字,以后就可以通过名字找到URL,可以通过名字反生成URL)

      在项目包的URL中,URL用正则接受传值,如果用(?P<a>\w+)那么在views中的函数v的值就不能是args ,而是kwargs{‘a1’:11111111}

      url(r' index/(\w+)', views.index, name='n1'),  

      在view中

      from django.urls import reverse

      def index(requrest):

        user_list = [

          ' wangzhe', ' george', ' jony'

        ]

      v = reverse('n1',args=(XXXXXXX))      args就是参数传的值。

      print(v)

      return render()

    在写页面是的action的URL地址就可以写成{ %  url “n1”%}

    在取值时也可以在a标签中写成{% url ‘n1’ i%}如果正则传多值,那“ i ”就多加几个,用空格隔开。

  2、视图函数:是Django中开发者处理HTTP请求的Python函数,视图函数的功能是通过模型层对象处理数据,然后用(1直接构成HTTP body,2用数据渲染html模板文件,3如有逻辑错误,则返回http错误或其他状态)一种方法返回HttpResponse。

    (1) 直接构造html页面:直接在视图函数中构造返回给客户端的字符串,通过httpresponse()函数封装后返回,给相应的服务器的时间给客户端

        from Django.http import httpResponse

        import datetime

        def current_datetime(request):

          now = datetime.datetime.now().strftime("%Y-%m-%d   %H:%M:%S")

          return HttpResponse(now) 

    (2)用数据渲染HTML模板文件:模板的内容可以非常丰富,所以使用渲染模板文件的方法返回页面是最常见的Django视图函数技术,模板渲染通过render()函数实现。

      from django.shortcuts import render

      from app.models import Moment

      def detail(request, moment_id):

        m = Moment.objects.get(id = moment_id)

        return render(request,'temlates/moment.html',{'headline':m.headline,'user':m.user_name})

            render()函数中,第一个参数是http中的request的返回值,第二个参数是模板文件名,第三个参数是以字典形式表达的模板参数。

    (3)返回HTTP错误:

      HTTP错误通过HTTP头中的status表达,通过给httpresponse构造函数传递status参数,可以返回HTTP错误或状态。

      from django.http import HttpResponse

      def my_view(request):

        return HttpResponse(status=404)

      

      

  3、模板语法:

    (1)变量替换:

    (2)过滤器:

    (3)流程控制:

    (4)模板继承:

    

五、Django模块层:主要是ORM的操作。

  1、基本操作:Django模型开发的任务就是定义模型类和属性。每个模型类都都可以映射为数据库中的一个数据表,而类属性被映射为数据字段。数据库表的主键,外键,约束,都可以通过类属性完成定义。

    (1)模型类的定义:基本结构↓^_^:

      from django.db import models               #所有的Django模型继承都是来自Django.db    models.Model类

      class ModelName(models.Model):

        field1 = models.XXfield(...........)         #通过类属性定义模型的字段,模型的字段必须是models.XXField类型

        field2 = models.XXfield(...........)  

        .......

        class Meta:  ---------------#模型类中的meta子类定义模型元数据, 可以定义数据库表名,数据默认排列方式等。meta类的属性名由Django预定义。

          db_table = ...

          other_metas = ...

      常用的meta类的属性:

        abstract: True or False   标识本类是否为抽象了。

        app_label:定义本类的所属应用,比如app_label = ‘myapp’

        db_table:映射的数据表名,db_table = ‘moment’

        注:如何meta中不提供db_table字段,那么Django会为模型自行生成数据表名,生成的格式会为“应用名_模型名”,比如应用app的模型comment的默认数据表名为“app_comment”

    (2)普通字段的类型:

    (3)常用字段的参数:

    (4)基本查询:

    (5)数据保存及删除:

    

  2、关系操作:

    (1)一对一:

    (2)一对多:

    (3)多对多:

  3、面向对象的ORM:

    ORM(Object Relational Mapping,简称ORM)为对象关系映射,是为了解决面向对象与关系数据库之间互不匹配而产生的技术。

    Django模型中的ORM之所以强大,是因为可以支持模型继承。它将Python的面向对象和数据库面向关系表的数据结构相结合。就有了ORM的三种风格。

    抽象类继承:父类来自models.Model,但不会在底层数据库中生成相应的数据表,父类的属性列存储在其子类的数据表中。

    多表类继承:多表继承类的每个模型都在底层数据库中生成相应的数据表管理数据。

    代理模型继承: 父类用于在底层数据库中管理数据表,而子类不定义数据列,只定义查询数据集的排序方法等元数据。

    (1)抽象类继承:

    (2)多表类继承:

    (3)代理模型继承:

原文地址:https://www.cnblogs.com/george92/p/7076093.html