Python Django基础二之URL路由系统


Posted in Python onJuly 18, 2019

MVC和MTV框架

MVC

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

Python Django基础二之URL路由系统

| M:models数据库相关;V:views视图相关 C:controller控制器 url分发 |

MTV

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

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

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

Python Django基础二之URL路由系统

| M:models数据库相关; T:templates模板 html文件 ;V:views视图相关 + url分发 |

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

Django下载安装

Django官网下载页面

1、下载Django:

pip3 install django==1.11.9

2、创建一个django project

django-admin startproject first_project   #创建了一个名为"first_project"的Django 项目:

3、启动django项目

python manage.py runserver 127.0.0.1:8001
python manage.py runserver 8001  #本机就不用写ip地址了 
python manage.py runserver #如果连端口都没写,默认是本机的8000端口

这样我们的django就启动起来了,只不过什么逻辑也没有呢!

当我们访问:http://127.0.0.1:8080/时就可以看到:

Python Django基础二之URL路由系统

Python Django基础二之URL路由系统

​ 当前目录下会生成first_project的工程,目录结构如下:(大家注意昂,pip下载下来的django你就理解成一个模块,而不是django项目,这个模块可以帮我们创建django项目)

Python Django基础二之URL路由系统

  • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库,启动关闭项目与项目交互等,不管你将框架分了几个文件,必然有一个启动文件,其实他们本身就是一个文件。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。
  • wsgi.py ---- runserver命令就使用wsgiref模块做简单的web server,后面会看到renserver命令,所有与socket相关的内容都在这个文件里面了,目前不需要关注它。

创建app

python manage.py startapp app名称
在settings中配置
'app01.apps.App01Config'  或者'app01'

pycharm创建django项目

1.file -->new project

Python Django基础二之URL路由系统

2.Django -->项目名称 -->选择Python选择器 -->应用名称(业务逻辑相关的程序)

Python Django基础二之URL路由系统

项目目录结构:

Python Django基础二之URL路由系统

写一个Django项目:

做一个登录页面的Web项目,浏览器输入网址得到一个web页面
输入网址:127.0.0.1:8000/login/

1.创建项目 second_pro
2.创建app app02
3.urls.py
  from django.conf.urls import url
  from django.contrib import admin
  from app02 import views

  urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),

  ]

4.views.py 写逻辑视图
  from django.shortcuts import render,HttpResponse
  # Create your views here.
  def index(request):
    # print(request.method)  #获取请求方式GET或POST
    if request.method=='GET':
      return render(request,'login.html') #回复一个页面
    else:
      username=request.POST.get('username')  #获取post数据
      password=request.POST.get('password')
      if username=='anwen' and password=='123':
        return HttpResponse('登录成功!')  #回复字符串
      else:
        return HttpResponse('登录失败!')
      
5.在templates文件夹中创建login.html 页面
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>login</title>
  </head>
  <body>
  <form action="/index/" method="post">
    <div>
      用户名:<input type="text" name="username">
    </div>
    <div>
      密码: <input type="text" name="password">
    </div>
    <input type="submit">
  </form>
  </body>
</html>

注意:
  1.urls.py 里面需要注意的问题:
  url(r'index/',views.index) #第一个参数路径正则字符串,第二个参数对应的视图逻辑

2.
def index(request):
    # print(request.method)  #获取请求方式GET或POST
    request.GET ---GET请求发送来的所有数据,queryDict类型
    request.POST ---POST请求发送来的所有数据,queryDict类型
    request.GET.get('username')   #获取get数据
    request.POST.get('username')  #获取post数据
    
    return render(request,'login.html') #回复一个页面
    return HttpResponse('登录成功!')  #回复字符串

get请求获取数据:

def index(request):
  print(retuest.GET) #<QueryDict:{'username':'anwen','password':['123']}>
  username=request.GET.get('username')
  password=request.GET.get('password')
  print(username,password)
  
  if username=='anwen' and password =='123':
    return HttpResponse('登录成功')
  else:
    return HttpResponse('登录失败')

post请求提交数据时关掉一个认证机制,settings配置文件中

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  # 'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

URL配置

无名分组

url(r'^books/(\d{4})/',views.books)   #(\d{4})

位置参数

url(r'^books/(\d{4})/',views.year_books)  #匹配年份
url(r'^books/(\d{4})/(\d{1,2})/',views_year_month_books) #匹配年份和月份
#http://127.0.0.1:8000/books/2019/2/

视图:
def year_month_books(request,year,month): #位置参数 ,第一个参数接收的是无名分组路径中匹配到的第一个的分组数据,第二个参数接收到的就是无名分组中路径中匹配到的第二个分组数据
  print(year,month)

分组命名匹配

在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。使用命名组的重写
url(r'^books/(?p<year>\d{4})/(?p<month>\d{1,2}/',views.year_month_books)#匹配年份和月份
def year_month)books(request,.month,year):#形参名称要和url中的分组名称对应,参数位置没有顺序要求
  print(year,month)

默认值

#urls.py中
from django.conf.url import url
from . import views
urlpatterns=[
  # 视图函数中指定默认值,如果第一个模式匹配上了,year_books()函数将使用其默认参数num=“1”,如果第二个模式匹配,year_books()将使用正则表达式捕获到的num值。
  url(r'^books/$', views.year_books),
  url(r'^books/(?P<num>\d{4})', views.year_books),
]

#views.py中
def pag(request,num='10'):
  pass

注意事项

  1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
  3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  4. 每个正则表达式前面的'r' 是可选的但是建议加上。^articles& 以什么结尾,以什么开头,严格限制路径

url末尾加'/'补充说明

#是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True

Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。其效果就是:我们定义了urls.py:
  from django.conf.urls import url
  from app01 import views

  urlpatterns = [
      url(r'^blog/$', views.blog),
  ]
  
访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。

如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

url路由分发之include

#项目文件夹下的urls.py文件中的url写法:
  from django.conf.urls import url,include
  from django.contrib import admin
  from app01 import views
  urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    #首页
    url(r'^$', views.base),

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

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

  ]
  
#app01下urls.py内容写法
  from django.conf.urls import url
  from django.contrib import admin
  from app01 import views
  urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^$', views.app01base),
    url(r'^index/', views.index),
  ]
  
#app02下urls.py内容写法  
  from django.conf.urls import url
  from django.contrib import admin
  from app02 import views

  urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^$', views.app02base),
    url(r'^home/', views.home),
  ]

总结

以上所述是小编给大家介绍的Python Django基础二之URL路由系统 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python3.5实现socket通讯示例(TCP)
Feb 07 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python join方法使用详解
Jul 30 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python3.6编写的单元测试示例
Aug 17 Python
Python循环实现n的全排列功能
Sep 16 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
python路径的写法及目录的获取方式
Dec 26 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 #Python
Django基础三之视图函数的使用方法
Jul 18 #Python
详解python实现小波变换的一个简单例子
Jul 18 #Python
Django基础知识 URL路由系统详解
Jul 18 #Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 #Python
Django基础知识 web框架的本质详解
Jul 18 #Python
django 使用全局搜索功能的实例详解
Jul 18 #Python
You might like
php字符串截取的简单方法
2013/07/04 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
python添加模块搜索路径方法
2017/09/11 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
大整数数相乘的问题
2012/07/22 面试题
商得四方公司面试题(gid+)
2014/04/30 面试题
Delphi软件工程师试题
2013/01/29 面试题
总经理秘书工作职责
2013/12/26 职场文书
教师节促销活动方案
2014/02/14 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
企业法人授权委托书
2014/09/25 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang