昨日内容回顾:

1. socket创建服务器

2. http协议:
    请求协议
       请求首行     请求方式 url?a=1&b=2  协议
       请求头       key:value
       请求体       a=1&b=2(只有post请求才有请求体)
         
    响应协议 
        响应首行    协议 状态码 文本
        响应头      key:value
        响应体      html字符串

3. wsgiref模块(基于wsgi协议)

    功能:
        1. 按着http协议请求格式解析请求数据----envision:{} 
               2. 按着http协议响应格式封装响应数据----response    
基于wsgiref实现了一个简单web框架

    1. urls : 存放路由关系
views: 存放视图函数
templates: 存放html文件
wsgi-sever:启动文件

MVC与MTV模型

MVC

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

Django基础(1)

mvc主要用于web框架,常用的开发语言,有java,php,node.js等等。

web框架应用最广泛就是PHP了,它只能做web开发,而且开发效率很快。

 

MTV模型

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

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

  Template(模板):放所有的html文件

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

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


除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

Django基础(1)

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

 

这里面最难的部分就是model,后面会慢慢讲到。

django 有一个ORM,它是专门来操作数据库的。这套语法,需要大量练习才能掌握。

 

MVC和MTV模型的区别:

MVC:
    M : model (与数据库打交道)
    V :  views  (存放html文件)
    C : Controller(逻辑控制部分)        
MTV 
    M : model     (与数据库打交道)
    T : templates    (存放html文件)    
    V : views      (逻辑处理)
    +
    路由控制层(分发哪一个路径由哪一个视图函数处理),它没有单独的分层。它作为URL分发器,将url请求分发给不同的view处理 

Django的下载与基本命令

1、下载Django:

pip3 install django == 2.1.1   ---下载一个最新版本

2、创建一个django project

windows用户,以管理员身份打开一个cmd窗口。进入一个空目录,运行以下命令:

E:\python_script\django框架\day2>django-admin startproject mysite

当前目录下会生成mysite的工程,目录结构如下:

mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。

        #manage.py  .启动文件,与项目交互的文件
settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
urls.py ----- 负责把URL模式映射到应用程序。

 

manage.py : 它不关是启动文件,他还是与Django交互的文件.比如:

python manage.py  runserver   : 运行项目
python manage.py  startapp    : 创建应用

如果运行项目时,不指定端口,默认监听本机的8000端口。

3、在mysite目录下创建应用

#进入mysite目录
E:\python_script\django框架\day2>cd mysite
#创建应用blog
E:\python_script\django框架\day2\mysite>python manage.py startapp blog

目录结构如下:

mysite/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

views.py---存放视图函数

models--与数据库打交道

还有一个目录templates,它是用来存放html文件的,下面会讲到。

 

从上面的目录结构可以看出,mysite目录下有一个blog。那么顶层的mysite,叫做 项目。底层的blog叫做应用。

比如微信是一个项目。聊天,朋友圈,支付...都是应用。
项目是必须包含应用的,项目可以包含多个应用。

mysite下的mysite,是全局文件,它有2个全局配置文件,一个是settings.py(项目配置文件),一个是urls.py(路由控制文件)。

wsgi.py是封装socket,用来接收和响应请求的。这个文件,从来都不需要动。

 

4、启动django项目

E:\python_script\django框架\day2\mysite>python manage.py runserver 8080
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 21, 2018 - 19:33:29
Django version 2.0.6, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.

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

Django基础(1)

视图层之路由配置系统(views)

 

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

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

'''
    
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
]


参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

    '''

URLconf的正则字符串参数

1. 简单的路由配置

通过正则分组获取url中的动态参数

(以下配置是django1x版本,所以l是url;2x版本则是path)

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),
]

注意:   

  1) 若要从URL中捕获一个值,只需要在它周围放置一对圆括号

  2) 不需要添加一个前导的反斜杠,因为每个URL都有.例如应该是^articles 而不是 ^/articles

  3)  每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

实例:

'''
 一些请求的例子:

/articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。
/articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。
/articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。
/articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。
    
    
    '''

2. 有名分组

给分组起一个名字,实现关键字传参

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

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

下面是以上URLconf 使用命名组的重写:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

有名分组和无名分组:

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

urlpatterns = [
  #无名分组
    url(r'^article/\d{4}', views.year) ,

    url(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)
]

 

这个实现与前面的实例完全相同,只有一个细微的差别:  捕获的值作为关键字参数而不是位置参数传递给视图函数.例如:

'''
    /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。
    /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

    '''

在实际应用中,这意味你的URLconf 会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;

3. 分发

把每一个app自己的url分发各自的路由文件中

mysite1 为一个django工程

  cmdb为一个项目

  dashboard为一个项目

在mysite1工程下的urls.py中定义如下:
from django.conf.urls import url,include
from cmdb.views import cmdb_index,login,home
from dashboard import views

#在两个项目里分别创建自己的url.py,在自己的url.py中定义url规则,这样就可以解决都在工程下的urls.py中定义混乱的问题
#使用includ关键字将两个项目的url加载进来
urlpatterns = [
    url(r'cmdb', include("cmdb.url")), 
    url(r'dashboard', include("dashboard.url"))
]
------------------------------------------------------------
cmdb项目下的url.py文件:
from django.conf.urls import url
from django.contrib import admin
from cmdb import views

urlpatterns = [
    url(r'login', views.login)
]
------------------------------------------------------------
dashboard项目下的url.py文件:
from django.conf.urls import url
from django.contrib import admin
from dashboard import views

urlpatterns = [
    url(r'login', views.login)
]
View Code

相关文章:

  • 2021-11-27
  • 2022-12-23
  • 2021-07-31
  • 2022-12-23
  • 2022-02-08
  • 2022-12-23
  • 2021-05-08
猜你喜欢
  • 2021-10-08
  • 2022-02-19
  • 2021-10-15
  • 2022-01-14
  • 2021-10-05
  • 2021-12-21
  • 2021-05-23
相关资源
相似解决方案