Python Django基础二之URL路由系统

MVC和MTV框架

MVC

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

| 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的响应模式如下所示:

| 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/时就可以看到

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

  • 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

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

项目目录结构:

写一个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路由系统 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 创建视图并访问 项目中自带的Python文件中,并没有带有视图,因此我们自己创建一个,通常,我们把视图命名views.py. 然后在views.py中,导入头文件 from django.http import HttpResponse 然后我们在views.py中,写一些Python函数,用来访

  • Python的Django框架中的URL配置与松耦合

    现在是好时机来指出Django和URL配置背后的哲学: 松耦合 原则. 简单的说,松耦合是一个 重要的保证互换性的软件开发方法. Django的URL配置就是一个很好的例子. 在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方. 这使得 开发人员可以修改一块而不会影响另一块. 例如,考虑一下current_datetime视图. 如果我们想把它的URL 从原来的 /time/ 改变到 /currenttim

  • 使用url_helper简化Python中Django框架的url配置教程

    django的url采用正则表达式进行配置,虽然强大却也广为诟病.反对者们认为django的url配置过于繁琐,且不支持默认的路由功能. 我倒觉得还好,只是如果觉得不爽,为什么不自己小小的hack一下,反正也就几行代码的事. 在这个背景下,我整了这个url_helper,利用url_helper可以简化配置和实现url的默认路由.所谓的url_helper其实就只有url_helper.py一个文件,使用的时候只想要import就可以. url_helper的具体用法请参考具体的例子: url_

  • Python的Django框架中URLconf相关的一些技巧整理

    提供视图配置选项 如果你发布一个Django的应用,你的用户可能会希望配置上能有些自由度. 这种情况下,为你认为用户可能希望改变的配置选项添加一些钩子到你的视图中会是一个很好的主意. 你可以用额外URLconf参数实现. 一个应用中比较常见的可供配置代码是模板名字: def my_view(request, template_name): var = do_something() return render_to_response(template_name, {'var': var}) 了解捕

  • Python中Django框架利用url来控制登录的方法

    本文实例讲述了Python中Django框架利用url来控制登录的方法.分享给大家供大家参考.具体如下: from django.conf.urls.defaults import patterns,url #or use login_required from django.contrib.admin.views.decorators import staff_member_required def login_url(regex, view, *p,**args): """

  • Python的Django框架中从url中捕捉文本的方法

    每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式. 举个例子,在这行URLConf中: (r'^articles/(?P<year>\d{4})/$', views.year_archive), 尽管 \d{4} 将只匹配整数的字符串,但是参数 year 是作为字符串传至 views.year_archive() 的,而不是整型. 当你在写视图代码时记住这点很重要,许多Python内建的方法对于接受的对象的类型很讲究. 许多内置Python函数是挑剔的(这是理所当然

  • Python Django基础二之URL路由系统

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

  • Django基础知识 URL路由系统详解

    MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示: MTV Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值: M 代表模型(Model):

  • 剖析Asp.Net路由系统实现原理

    对于Asp.Net Web Forms应用来说,请求的Url都是对应一个具体的物理文件(http://xxx.com/default.aspx).这样的Url与具体物理文件紧密绑定在一起,带来了诸多方便的局限:可读性.SEO优化等.为了解决这些局限性,微软引入了URL路由系统.下面通过一个Demo来剖析一下Asp.Net的路由系统. 创建一个空的WebForm应用程序,在Global.asax.cs文件中加入如下代码: public class Global : System.Web.HttpA

  • 利用Python Django实现简单博客系统

    第一节 - 基础 1. 简单的导览图,学会不迷路 对 Django 的评价:借用李清照的<鹧鸪天 桂花>来表达, 暗淡轻黄体性柔.情疏迹远只香留.何须浅碧深红色,自是花中第一流. 梅定妒,菊应羞.画阑开处冠中秋.骚人可煞无情思,何事当年不见收. Django makes it easier to build better Web apps more quickly and with less code. 容易上手,开发速度快 囊括了网站开发中的用户管理,内容管理,网站地图,RSS等常用的插件

  • Python采用Django开发自己的博客系统

    好久之前就想做一下自己的博客系统了,但是在网上查了查好像是需要会一些Node.js的相关知识,而且还要安装辣么多的库什么的,就不想碰了.但是我遇到了Django这么一款神器,没想到我的博客系统就这么建立起来了.虽然是最基础的类型.但是也算是成功了,这篇博客比较适合对Django有了一定了解的童鞋,如果是新手的话,建议先看一下django的基础知识点再来做实验,这样效率更高! 好了,话不多说,开始吧. 搭建框架  •创建项目及应用 搭建框架的意思,就是安装Django以及做好相关的配置.因为我是在

  • Python django框架开发发布会签到系统(web开发)

    引言 最近学习了虫师的发布会签到系统demo,结合自己所学django知识,对demo重新塑造了一下.也是为了练练手,巩固知识.现在就分享一下成果~ Django工作流 学习django web开发,先来简单了解一下django的工作机制,请看下图: 简单说明: 用户通过浏览器访问:http://127.0.0.1:8000/index,首先运行的是urlpatterns程序,通过url路由找到对应的视图函数views.py,视图函数处理所有逻辑和数据,并且将用户要的数据经过函数处理后通过ind

  • Django url 路由匹配过程详解

    1 Django 如何处理一个请求 当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码使用的算法: Django 确定使用根 URLconf 模块.通常,这是 ROOT_URLCONF 设置的值(即 settings 中的 ROOT_URLCONF),但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置.可以在 django/core/handlers/base.p

  • 在Linux系统上部署Apache+Python+Django+MySQL环境

    Linux+apache+mysql+python+mod_python+Django 说明:系统rhel 5.3,默认安装httpd.mysql,没有安装的,请下载安装RPM包,删除/etc/httpd/modules/mod_python.so,如果有的话. 一.安装python wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz  tar xfz mod_python-2.7.11.tgz cd python-2.7.1

  • Python django框架输入汉字,数字,字符生成二维码实现详解

    这篇文章主要介绍了Python django框架输入汉字,数字,字符转成二维码实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 模块必备:Python环境 + pillow + qrcode 模块 核心代码<br>import qrcode qr = qrcode.QRCode( version=2, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=20, bord

随机推荐