Django 路由层

Django的下载与基本命令

  • 下载Django:pip3 install django==2.0.1
  • 创建一个django project: django-admin startproject luffy
  • 在mysite目录下创建应用:python manage.py startapp app01
  • 启动django项目:python manage.py runserver 8080 我们访问:http://127.0.0.1:8080/时就可以看到:
  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py createsuperuser
  • 命令行查看django版本:python -m django --version

一、文件介绍

  • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。

静态文件

?
1
2
3
4
5
#在settings.py中:
STATIC_URL = '/static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)

路由

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。

一、简单的路由配置

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在urls.py中:
from django.urls import path,re_path
from app01 import views
# 路由配置: 路径--------->视图函数
urlpatterns = [
    path('admin/', admin.site.urls),
    #无名分组:捕获的值作为位置参数传递给视图函数
    re_path(r'^articles/([0-9]{4})/$', views.year_archive), #year_archive(request,'2009')
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),# month_archive(request,'2009','12')
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), # month_archive(request,'2009','12','1'),# month_archive(request,'2009','12','13')
    #有名分组:捕获的值作为关键字参数传递给视图函数
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),# month_archive(request, year='2005')
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # month_archive(request, year='2005', month='03')
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), # month_archive(request, year='2003', month='03', day='03')
]

二、分发

?
1
2
3
4
5
6
7
8
9
10
11
# 在urls.py中:
from django.urls import path, re_path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    # 分发
    re_path(r"^app01/", include("app01.urls")),
    re_path(r"^app02/", include("app02.urls")),
    re_path(r"^", include("app01.urls")),
]

三、反向解析

获得URL 的最终形式,,对于不同层级,Django 提供不同的工具用于URL 反查:

  • 在模板中:使用url 模板标签。
  • 在Python 代码中:使用from django.urls import reverse
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 在urls.py中:
from django.urls import path, re_path, include
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    # 反向解析
    path('login.html/', views.login, name="Log"),
    re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive, name='news-year'),
]
# 在模板中:注意参数
"""
<form action="{% url 'Log' %}" method="post"></form>
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
<!--多个参数-->
<a href="{% url "n4" i1 i2 %}">编辑</a>
"""
# 在views.py中:
from django.urls import reverse
from django.shortcuts import render, HttpResponse, redirect
def redirect_to_year(request):
    # 无参
    url = reverse('Log')
    print(url)
    # 有参
    year = 2006
    url88 = reverse('news-year-archive', args=(year,))
    url99 = reverse('news-year', kwargs={'year':2008})
    return HttpResponse('OK')

四、名称空间

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 在urls.py中:
from django.urls import path, re_path, include, url
urlpatterns = [
    path('admin/', admin.site.urls),
    # 分发
    re_path(r"^app01/", include("app01.urls")),
    re_path(r"^", include("app01.urls")),
    # 两个应用中,URL 模式名字一样时:
    re_path(r"^app01/", include(("app01.urls", "app01"))),
    re_path(r"^app02/", include(("app02.urls", "app02"))),
]
# 模板中
{ % url 'app01:index' %}
{ % url 'app02:index' pk=item.id %}  带参数的
# app01中的urls.py
from django.urls import path, re_path
from app01 import views
urlpatterns = [
    re_path("index/", views.index, name="index")
]
# app02中的urls.py
from django.urls import path, re_path
from app02 import views
urlpatterns = [
    re_path("index/", views.index, name="index")
]
# app01中的views.py
from django.shortcuts import render, HttpResponse,redirect
from django.urls import reverse
def index(reqeust):
    return redirect(reverse("app01:index"))
# app02中的views.py
from django.shortcuts import render, HttpResponse
from django.urls import reverse
def index(reqeust):
    return redirect(reverse("app02:index"))

1、注意

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 'Specifying a namespace in include() without providing an app_name '
"""
方法1:在proj/urls.py中修改
"""
urlpatterns = [
    # url(r'^rbac/', include('rbac.urls', namespace='rbac')),
    url(r'^rbac/', include(('rbac.urls','rbac'), namespace='rbac')),
]
"""
方法2:在rbac/urls.py中 添加 app_name='rbac'
"""
app_name='rbac'
urlpatterns = [
    url(r'^role/list/$', role.role_list, name='role_list'),  # rbac:role_list
    ...
]
"""
'ForeignKey' object has no attribute 'rel'
"""
self.remote_field = rel
# return SearchGroupRow(title, field_object.rel.model.objects.filter(**db_condition), self, request.GET)
return SearchGroupRow(title, field_object.remote_field.model.objects.filter(**db_condition), self, request.GET)

五、django2.0版的path

1、基本实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在urls.py中:
from django.urls import path, re_path
from app01 import views
urlpatterns = [
    re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
    re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', views.detail_view),
    re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', views.edit_view),
    re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', views.delete_view),
]
"""
1.函数 year_archive 中year参数是字符串类型的
2.三个路由中article_id都是同样的正则表达式,但是你需要写三遍,当之后article_id规则改变后,需要同时修改三处代码,
在Django2.0中,可以使用 path 解决以上的两个问题。
"""
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),
]

2、基本规则

  • 使用尖括号(<>)从url中捕获值。
  • 捕获值中可以包含一个转化器类型(converter type),比如使用 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
  • 无需添加前导斜杠。

3、path转化器

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符

4、注册自定义转化器

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型
  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# urls.py:
from django.urls import register_converter, path
from app01 import yearconvert,views
#使用register_converter 将其注册到URL配置中:
register_converter(yearconvert.FourDigitYearConverter, 'yyyy')
urlpatterns = [
    path('articles/<yyyy:year>/', views.year_archive),
]
#app01.yearconvert.py:
class FourDigitYearConverter:
    regex = '[0-9]{4}'  #规则
    def to_python(self, value):
        return int(value) # 在这转换了类型
    def to_url(self, value):
        return '%04d' % value
#app01.views.py:
from django.shortcuts import render,HttpResponse,redirect
def year_archive(request,year):
    print(year,type(year))
    return HttpResponse('ok')

MVC与MTV模型

一、MVC

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

二、MTV

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

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
  • 除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

转载于:https://www.cnblogs.com/bubu99/p/10258417.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

caffe安装_目标检测之caffe-ssd模型训练与测试

最近把一个ssd网络的net..prototxt网络结构和自己生成的hdf5格式数据一起做训练时发现经常报错&#xff0c;因为ssd中一些层在caffe中并没有实现&#xff0c;需要自己写相应的.cpp,.cu文件重新编译&#xff0c;比较麻烦&#xff0c;而大家通常训练caffe-ssd都是基于原作者公开的…

Python之classmethod和staticmethod的区别

python中3种方式定义类方法&#xff0c;常规方式、classmethod修饰方式、staticmethod修饰方式。 class A(object):def foo(self, x):print(调用foo函数 (%s, %s)%(self, x))print(self:, self)classmethoddef class_foo(cls, x):print(调用class_foo函数 (%s, %s) % (cls, x))…

php开发微信图灵机器人

本着开源为原则&#xff0c;为这个世界更美好作出一份共享&#xff0c;我就给大家做个指路人&#xff0c;如果实用&#xff0c;记得给提供开源的朋友一些鼓励。 简单介绍一下实现思路&#xff0c;使用swoole扩展接管php运行&#xff0c;由于swoole只能在类UNIX上运行&#xff0…

jQuery源码的基础知识

序言&#xff1a;DOM addEventListener attachEvent与addEventListener区别适应的浏览器版本不同&#xff0c;同时在使用的过程中要注意attachEvent方法 按钮onclickaddEventListener方法 按钮click一、arguments对象&#xff1a; 1、arguments 属性 为当前执行…

python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...

数据库数据导出为excel表格&#xff0c;也可以说是一个很常用的功能了。毕竟不是任何人都懂数据库操作语句的。 下面先来看看完成的效果吧。 数据源导出结果依赖 由于是Python实现的&#xff0c;所以需要有Python环境的支持 Python2.7.11 我的Python环境是2.7.11。虽然你用的可…

android手机连接无线路由器上网设置,手机连接无线网络怎么设置?手机Wifi无线网设置教程...

随着智能手机无线上网的流行&#xff0c;如今很多家庭都会组建Wifi无线网络&#xff0c;目前组建Wifi网络&#xff0c;大致有两种情况&#xff0c;一种是使用无线路由器&#xff0c;另外一种是将笔记本变身无线无路由器&#xff0c;从而实现智能手机也可以免费Wifi上网&#xf…

通俗易懂了解Vuex

1.前言 在使用Vue进行开发的时候&#xff0c;关于vue组件通信的方式&#xff0c;除了通俗易懂了解Vue组件的通信方式这篇博文谈到三种通信方式&#xff0c;其实vue更提倡我们使用vuex来进行组件间的状态管理以及通信问题。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。…

netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构

(给DotNet加星标&#xff0c;提升.Net技能)英文&#xff1a;samueleresca.net译文&#xff1a;cnblogs.com/Rwing/p/fast-growing译者&#xff1a;Rwing本篇文章的第一部分介绍了有关Serverless计算的基本概念。第二部分展示了如何构建 .NET Core的Lambda函数&#xff0c;其中使…

更多Requests的小技巧以及总结

对于requests的爬虫库&#xff0c;我们已经学到了尾声。 我们在这儿可以挖掘出更多的requests的使用小技巧。 一.cookie对象与字典的转换 在爬取目标cookie的时候&#xff0c;我们可以将cookie信息进行简化处理。 现在做一个简单的代码验证看看&#xff0c;使用百度的cookies&a…

进入Undertow Web服务器

随着Java EE 7的到来以及处理诸如Web Sockets API和HTTP升级&#xff08;例如EJB over HTTP&#xff09;之类的高级功能的要求&#xff0c;WildFly开发团队已经做出了重要决定。 在长期致力于JBoss Web服务器&#xff08;Apache Tomcat的一个分支&#xff09;之后&#xff0c;新…

centos 重启网卡_CentOS6 网络管理之网卡配置及简单路由设置

CentOS6中关于网络配置的命令有很多&#xff0c;本文将介绍几个平时最长用的几个命令&#xff0c;以及网卡IP地址的配置和简单路由配置。1、经常使用的查看IP地址命令为 ifconfig&#xff0c;不跟参数的情况下默认查看所有已启用的网卡信息&#xff0c;如下图所示&#xff1a;如…

绝地求生 android版支持蓝牙吗,《绝地求生》吃鸡必须要顶配吗?这些配置也能畅玩...

导读《绝地求生》火爆之余&#xff0c;很多人在想要加入这款游戏时&#xff0c;却被游戏传闻中的超高配置要求给吓到了&#xff0c;然后心生退意。事实上&#xff0c;吃鸡的配置要求真的这么高吗&#xff1f;其实并不是&#xff01;传言1&#xff1a;8G内存不能玩这则传言的说法…

《美团机器学习实践》高清PDF+思维导图+美团算法团队

在美团的搜索、推荐、计算广告、风控、图像处理等领域&#xff0c;相关的人工智能技术得到广泛的应用。《美团机器学习实践》包括通用流程、数据挖掘、搜索和推荐、计算广告、深度学习以及算法工程6大部分内容&#xff0c;全面介绍了美团在多个重要方面对机器学习的应用。通过本…

Java 8中的java.util.Random

Java 8中java.util.Random类的简洁功能之一是对其进行了改进&#xff0c;现在可以返回随机的数字流 。 例如&#xff0c;要生成一个介于0&#xff08;含&#xff09;和1&#xff08;不含&#xff09;之间的随机双精度数的无限流&#xff1a; Random random new Random(); Do…

appium判断元素是否存在_Python+selenium自动化之判定元素是否存在

在测试过程中&#xff0c;我碰到过这类的问题&#xff0c;使用find_element却找不到某个元素而产生异常&#xff0c;这就需要在操作某个元素之前判定该元素是否存在&#xff0c;而selenium中没有判定元素是否存在的方法&#xff0c;或者判定相同的元素有几个&#xff0c;需要操…

棋盘DP三连——洛谷 P1004 方格取数 洛谷 P1006 传纸条 Codevs 2853 方格游戏

P1004 方格取数 题目描述 设有N $\times N$NN的方格图(N $\le 9$)(N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字00。如下图所示&#xff08;见样例&#xff09;: A0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 …

html一张图片用两种滤镜,HTML图片CSS滤镜—灰度效果

this.p{ m:2,b:2,loftPermalink:,id:fks_082065087087086069087082087095083084084067083083082065,blogTitle:HTML图片CSS滤镜—灰度效果,blogAbstract: ,blogTag:html,blogUrl:blog/static/72507542200941384735902,isPublished:1,istop:false,type:2,modifyTime:13288029920…

怎么通过media foundation将图像数据写入虚拟摄像头_千倍成本压缩!特斯拉开发虚拟激光雷达,替代最贵自动驾驶传感器...

「谁用激光雷达&#xff0c;谁完蛋&#xff01;」在去年特斯拉举办的 Autonomy Day 上&#xff0c;特斯拉 CEO Elon Musk 言辞激烈地炮轰激光雷达。「昂贵的传感器是不必要的&#xff0c;这就像是一大堆昂贵的附属品。」「像阑尾一样。一个阑尾不好——那么&#xff0c;一大堆阑…

使用Drools 6.0进行部署

KieScanner 6.0 KieScanner取代了5.x KnowledgeAgent。 它使用嵌入式Maven允许在运行时解析和检索jar。 6.0应用程序现在可以轻松支持依赖关系和可传递依赖关系&#xff1b; 使用众所周知的Maven语义进行版本控制。 它允许在类路径上进行部署&#xff0c;也可以在运行时动态进行…

activemq安装与配置_ActiveMQ(消息队列)从入门到了解

一、 ActiveMQ 简介 1 什么是 ActiveMQ ActiveMQ 是 Apache 出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ 是一个 完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现&#xff0c;尽管 JMS 规范出台已经是很久 的事情了&#xff0c;但是 JMS 在当…