zoukankan      html  css  js  c++  java
  • Django

    本文内容来源:

    微信公众号:极客猴

    还有网络上的各位大佬们

    整体构造

    • 先运行 django-admin startproject <your-project> 创建项目(注意当前目录)
    • 再切换到项目路径下运行 python manage.py startapp <your-app>,创建项目的 app 。
    • 在每个 App 里写代码,写完了最后想要运行项目时运行 python manage.py runserver 来启动本地的开发服务器。

    django 提供的 shell :可以很方便的和我们的应用交互

    1.环境搭建

    创建虚拟环境,安装django

    2.django认识 mvc  mtv 工作流程

    model view control

    model template view

    1 MVC 与 MTV

    在 Web 服务器开发领域,MVC 模式可以算是家喻户晓。有些书籍或者文章说 Django 是一个 MVC 开发框架,另一些文章或者博客则说 Django 是 MTV 模式。那么 MTV 模式是什么?Django 又究竟是哪种模式?

    Django 是一个遵循 MVC 开发模式的框架 。我们先看下 MVC 的数据流向,了解 MVC 的工作流程。

    M 是 Model 的意思 ,它是一个抽象层,用来构建和操作 Web 应用中的数据。同时,Model 层跟数据库打交道的层次,执行数据库数据的增删改查操作。在 Django 项目中,Model 层逻辑是体现在 models.py 中,models.py 中定义的各种类代表数据模型 model 。每个 model 是对应数据库中唯一的一张表,每个 model 中的字段也对应表中的字段。

    V 指的是 View  层。在 Django 项目中,templates 文件夹中各个模版文件代表视图(View),负责数据内容的显示。templates 文件夹中文件其实就是 HTML、CSS、Javascript 文件。但在 HTML 中使用一些 Django 中特定的特殊语法,就可以实现动态内容插入,从而实现动态页面。

    C 全称是 Controller 。它通常是负责从视图读取数据,控制用户输入,并向模型发送数据。在 Django 项目中,urls.py (文件路由)中定义的各种 url 访问入口 和 view.py 中定义的各种处理函数(被称为 Django 视图函数)代表控制器(Controller )。urls.py 接受用户在浏览器中输入不同 url 地址的请求,然后分发给 view.py 。view.py 再根据文件中对应的函数与数据模型和视图交互,响应用户的请求。即将数据填充到模板(templates)中,呈现给用户。

    图片来源于网络

    在实际开发过程中,开发者主要操作对象是 models.py、view.py、templates 文件夹中各个模版文件。这就弱化 C 层的概念, 更加注重关注的是模型(Model)、模板(Template)和视图(Views),所以 Django 也被称为 MTV 框架 。

     2 Django 工作流程

    了解 Django 的模式,我们来了解 Django 程序是处理一个 HTTP 请求的流程。

    图片来源于网络

    图中显示 Django 程度接受到一个 HTTP 请求到返回请求内容的过程。各个路径的含义如下:

    1)用户使用浏览器浏览网页,浏览器向 Web 服务器发起 HTTP 请求。

    2)Web服务器(比如,Nginx)把这个请求转交到一个WSGI(比如,uWSGI),或者直接地文件系统能够取出一个文件(比如返回一个视频文件)。

    3)不像 web 服务器那样,WSGI 服务器可以直接运行 Python 应用。请求生成一个被称为 environ 的 Ptyhon 字典。而且可以选择传递过去几个中间件的层,最终达到 Django 应用。

    4)Django 根据请求的路径,URLconf 将请求分配对应的视图文件。这个请求被封装到 HttpRequest 中。URLconf 可以理解为 URL 以及该 URL所调用的视图函数之间的映射表,通常是记录到 urls.py 中。

    5)被选择的视图(Views.py 中的类)会根据页面的需求执行一些操作。例如通过模型(Model)与数据库进行通信;使用模板渲染 HTML或者任何格式化过的响应;访问页面出错,抛出一个异常等。在处理过程中,视图处理的对象主要是 HttpResponse。

    6)当 HttpResponse 对象离开 Django 后,被压缩成二进制流传输给浏览器(HTTP 请求的传输的内容是二进制数据)。

    7)浏览器收到 HTTP 的响应头,呈现给用户。

    3.文件作用

    project

    --template:存放模板

    --project:项目真正python包

      --inti

      --setting:配置文件

      --urls:url

      --wsgi:部署到服务器

    --application

      --migrations:迁移数据库用到

      --inti

      --model:模型管理文件

      --admin:后台管理文件

      --view:试图文件

      --tests:测试文件

      --apps:

    新建application:1.startapp name  2.在settings中加入 INSTALLED_APPS

    4.url配置:将每个 Web 请求根据 URL 地址来调用视图来显示

    试图函数与url:函数只写名字

    url:URL 地址定义是 协议://host:port/path 。假如有个地址是 http://127.0.0.1:8000/music。http 就是协议;127.0.0.1 是主机号,主机号可以是 IP 地址或者域名,不过域名是比较常见,因为容易记;port 是端口号,如果端口号是 80 可以忽略不写,其他则要填写完整;music 就是前面说的 path,端口号后面第一个 "/" 符号后面的字符串都是路径(path)。

    首页:index 比较特殊,我们通常把 index 设定为首页,所以访问首页的时候,path 不用填写。

    url(r'^$', views.index),          # 添加首页 url 匹配规则。index 就是刚才创建的函数。

    url匹配规则:

    返回httpresponse:返回字符串,返回html

    def index(request):
       return HttpResponse("Hello !这是我第一个 Django 项目")

    def content(request):
       return render(request, 'content.html')

    启动服务: python manage.py runserver 即可启动服务器。

    url的命名组:

    url 路由有另种命名组,一种是无名名组,另一种是有名分组。 无名分组是使用简单的、没有命名的正则表达式组(通过圆括号)来捕获 URL 中的值。上述两个例子和以下的一些都是都是无命名分组。

    from django.conf.urls import url
    from demo import views

    urlpatterns = [
       url(r'^content/2018/$', views.special_case_2018),
       url(r'^content/([0-9]{4})/$', views.year_content),
       url(r'^content/([0-9]{4})/([0-9]{2})/$', views.month_content),
       url(r'^content/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.detail_content)
    ]

    如果返回的 URL 的 path 为 /content/2018 时,是无法匹配到上面任何一个模式,因为每个模式要求 URL 以一个斜线结尾。paht 为 /content/2018/ 则能匹配到两个模式,是匹配到哪个呢?因为模式按照顺序来匹配的,所以第一个模式会被优先匹配。path 为 /content/2018/02/ 将匹配到第三个模式。Django 调用的是 views 文件中的 month_content(request, '2018', '02')

    无名分组的视图只能接受 python 中传入的固定值参数,如值 2018 等。但是无法获取到存放值的变量,而有名分组恰恰能解决这个痛点。有名分组只是在无名分组的正则表达式上增加一个参数即可。语法是(?Ppattern),其中 name 是组的名称,pattern 是要匹配的模式

    具体改造如下:

    from django.conf.urls import url
    from demo  import views

    urlpatterns = [
       url(r'^content/2018/$', views.special_case_2018),
       url(r'^articles/(?P<year>[0-9]{4})/$',  views.year_content),
       url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_content),
       url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.detail_content)
    ]

    经过改造之后,当访问 path 为 /content/2018/02/ 时,请求将调用views.content(request, year='2018', month='02')函数,而不是views.month_content(request, '2018', '02')。

    路由转发器:

    如果一个项目下有很多的 application,那么在 urls.py 里面就要写巨多的 urls 映射关系。这样看起来很不灵活,而且杂乱无章。这时候就要根据不同的 application 来分发不同的url请求。

    假如在上述的 project 中,我又新建了一个新的 application,名为 app02。配置路由转发器操作如下:首先,在 urls.py 里写入 urls 映射条目。值得注意是,要导入Django 的 include 方法。

    from django.conf.urls import url, include
    from django.contrib import admin

    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^app02/', include('app02.urls')),   // 将 url 为”app02/“的请求都交给 app02 下的 urls 去处理
    ]

    其次,在 app02 目录下创建一个 urls.py 文件,用来处理请求的url,使之与 views 建立映射。

    5.模板:HTML页面中带有特殊语句(用来存储并显示数据)

    变量和模板标签和过滤器

    • 用两个大括号括起来的文字(例如 {{ person_name }} )和 {{ company }} 称为 变量 。这里是插入一个变量的值。赋值是在 视图 (views.py)中操作的。

    • 被大括号和百分号包围的文本(例如 {% if ordered_warranty %} )是 模板

    • 标签(template tag) 。标签的作用是通知模板系统执行某些操作。
    • {% for item in item_list %} 是 模板的 for 标签。有点类似 Python 中的 for 语句,能够让你循环遍历序列中的内容。

    • {% if ordered_warranty %} 则是 if 标签,用于执行逻辑判断。

    • {{ship_date|date:”F j, Y” }} 中用到了 filter 过滤器。这是一种最方便的转换变量输出格式的方式。它的用法跟 Linux 的管道一样,使用管道符 “ | ” 。在这里,我们将变量 ship_date 传递给 date 过滤器,同时指定参数 F  j,Y

    上下文对象context:试图中的数据传到模板中渲染

    context可以传送中很多对象,包括我们自定义的类也可以

    加载模板文件:在view中,向模板中传数据,模板的目的就是分离前后端,不要直接在模板修改。

    常用标签:

    从上面的例子中可知,模板中有些常用的标签。让我们来深入了解各个标签的用法。

    2.1 if/else 标签

    {% if %} 标签检查一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% endif %} 之间的任何内容。在每一个 {% if %} 标签后面, 一定要用 {% endif %} 标签来关闭。如:

    {% if is_rain %}
       <p>外面正在下雨</p>
    {% endif %}

    如果需要 else 操作, 使用 {% else %} 标签。

    {% if is_rain %}
       <p>外面正在下雨。</p>
    {% else %}
       <p>今天是阴天。</p>
    {% endif %}

    {% if %} 标签用法跟 Python 中的 if 语法有些差别。因此需要重点关注下。它不支持用圆括号来组合操作,但支持接受 and , or 或者 not 关键字来对多个变量做判断。如:

    {% if sunny and hot %} 
       ...
    {% endif %}

    {% if sunny or rainy %} 
       ...
    {% endif %}

    {% if not rainy %} 
       ...
    {% endif %}

    另外{% if %} 并没有 {% elif %} 标签, 请使用嵌套的`` {% if %}`` 标签来达成同样的效果。

    2.2 for 标签

    {% for %} 标签允许我们遍历一个序列上的每一项。在每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

    例如,给定一个 图片列表 image_list,我们可以使用下面的代码来显示这个列表:

    <ul>
    {% for img in image_list %}
       <li>{{ img.url }}</li>
    {% endfor %}
    </ul>

    如果你想将列表反方向输出,可以使用 reversed 关键字。

    <ul>
    {% for img in image_list reversed %}
       <li>{{ img.url }}</li>
    {% endfor %}
    </ul>

    在执行循环之前,通常会先检测列表的大小。模板提供了一个标签 {% empty %}  来输出列表为空的提示。

    <ul>
    {% for img in image_list %}
       <li>{{ img.url }}</li>
    {% empty %} 
       <p>图片列表不能为空.</p>
    </ul>

    除此之外,{% for %} 标签还支持嵌套使用。

    {% for page in page_list %}
    <ul>
    {% for img in image_list %}
        <li>{{ img.url }}</li>
    {% endfor %}
    </ul>
    {% endfor %}

    跟 {% if %}  标签类似,{% for %} 标签的用法不能等同 Python 中的 for 语句。它不支持退出循环操作,即 break 语句;同样,它也不支持 continue 语句。

    在每个 {% for  %}循环中有一个被称为 ** forloop ** 的模板变量。这变量提供一些带有循环进度信息的属性。

    •  forloop.counter 表示当前循环的执行次数的总数。这个计数器是从 1 开始记录,所以在第一次循环操作是,forloop.counter 会被设置为 1。

    • forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

    • forloop.revcounter 是记录循环中还没有被遍历项的总数。循环初次执行时 forloop.revcounter 将被设置为序列的长度。 最后一次循环执行中,这个变量将被置1。

    • forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。因此,第一次循环执行的时候,该变量的值为 序列的长度减 1。

    • forloop.first 是一个布尔值。如果你需要在第一次循环时,执行一些操作。可以利用该属性。

    • forloop.last 也是布尔类型。用法跟 forloop.first 类似。它的运行场景是最后一个循环。

    2.3 ifequal 标签

    比较两个变量的值是在是太常见了,所以 Django 模板提供了 {% ifequal %} 标签提供我们使用。

    {% ifequal %} 标签比较两个值,当它们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。如下面的例子是比较两个模板变量 name 和 currentname:

    {% ifequal name curentname %}
        <p>名字是一样。</p>
    {% else %}
        <p>名字是不一样。</p>
    {% endifequal %}

    除了判断两个变量的值,该标签还支持字符串,整数和小数做为参数,但是不支持 Python 的列表类型、布尔类型和字典类型。

    模板还有一个比较不相等的 ifnotequal 标签,它的用法跟 ifequal 标签类似。

    2.4 注释标签

    如果是需要对单行进行注释操作,使用 {#  #} 标签:

    {# 单行注释 #}

    如果要实现多行注释,需用到 {% comment %} 模板标签,就像这样:

    {% comment %}
      多行注释
    {% endcomment %}
  • 相关阅读:
    关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案
    pycharm快捷键
    php 整理的零碎知识点
    phpadmin 导出csv格式的数据处理
    python 单例模式的实现
    Java单体应用
    Java单体应用
    Java单体应用
    Java单体应用
    Java单体应用
  • 原文地址:https://www.cnblogs.com/BlueFire-py/p/8502719.html
Copyright © 2011-2022 走看看