当前位置: 亚洲城ca88 > ca88 > 正文

django反向解析URL和URL命名空间的方法,django反向

时间:2019-05-18 00:54来源:ca88
django反向分析U索罗德L和U瑞鹰L命名空间 首先料定多少个概念: 1.在html页面上的开始和结果非常是向用户展示的url地址,比方大规模的超链接,图片链接等,最棒能动态变化,而不用固定. 2.一

django反向分析U索罗德L和U瑞鹰L命名空间


首先料定多少个概念:
1.在html页面上的开始和结果非常是向用户展示的url地址,比方大规模的超链接,图片链接等,最棒能动态变化,而不用固定.
2.一个django项目中貌似蕴涵了七个django应用(app).
三.三个视图(view)往往对应四个url地址.

在django中完成反向分析URubiconL必备条件就是url和view能一对一的匹配.
(通过view找到唯12个对应的url,通过url也能找到唯1三个view)

简易的措施就算选择name,能够知晓为url起了八个名字.
例如:

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

urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

此时的news-year-archive就能够表示/articles/nnnn/在view中展开使用.

在templates中使用

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

在view中使用

from django.urls import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

可是利用name也设有一定的问题,举个例子在同贰个连串中的分裂的app中name唯恐会重名(导致反深入分析时1个view对应多少个url),而且给每二个url起分化名字也很繁琐.

此时就能够用到U奥迪Q7L命名空间
U途达L命名空间包含多个部分:app_name(动用命名空间)以及namespace(实例命名空间)

对于app_name合法解释"它意味着正在布局的选拔的名目。三个利用的各样实例具备同等的施用命名空间。",相比好精晓.
约等于说能够由此设置app_name来分裂不一样app中同名的name了,使用:连接.

而是对于namespace官方表达"它代表应用的四个特定的实例。实例的命名空间在你的全套项目中应该是唯一的。可是,一个实例的命名空间能够和行使的命名空间一样。",就比较的不便通晓.

namespace重中之重意义为了差距同三个app下差别实例,使得反深入分析url时能博得不错的结果.

例如:
在不参加namespace时,
访问http://127.0.0.1:8000/ccc/aaa/http://127.0.0.1:8000/bbb/aaa/
结果均为/ccc/aaa/,那显著不是大家想要获取的结果.

# 主url.py
urlpatterns = [
    ...
    url(r'^bbb/', include("test_namespace2.urls")),
    url(r'^ccc/', include("test_namespace2.urls")),
    ...
]

# test_namespace2/url.py
app_name = "app02"

urlpatterns = [
    url(r'aaa/$', views.aaa, name="index"),
]

# test_namespace2/view.py
def aaa(request):
    return HttpResponse(reverse("app02:index"))

做出一些退换,插足namespace用作区分

# 主url.py
urlpatterns = [
    ...
    url(r'^bbb/', include("test_namespace2.urls", namespace='bbb')),  # 加入了namespace
    url(r'^ccc/', include("test_namespace2.urls", namespace='ccc')),
    ...
]

# test_namespace2/view.py
def aaa(request):
    return HttpResponse(reverse("app02:index", current_app=request.resolver_match.namespace))  # 使用namespace

这么就能拿走不错的结果了.


应用方法:

首先在,主url.py中添加namespace

urlpatterns = [
    url(r'^polls/', include('polls.urls',namespace='test')),
]

然后要在app的urls.py中增添app_namename
比如:

app_name = 'polls'
urlpatterns = [
    #...
    url(r'^$', views.index, name='index'),
    #...

然后在view和templates中选拔了,此时尽管有多个app中都闻名海外为indexname也不会有标题了
运用格局,使用形如app_name:name
在view中使用:

reverse('polls:index', current_app=request.resolver_match.namespace)

在templates中使用

{% url 'polls:index' %}

本文介绍了django反向深入分析U君越L和ULacrosseL命名空间,分享给我们,具体如下:

  大家在个中篇中学会了何等进展反向深入分析,不过有那般1个难题,在为 url 命名的时候,名字不可能再一次,不然会招致多姿多彩的标题。在 url 还少的时候保险不重名照旧相比轻易的,不过 url 多起来然后就相比较难了。为了消除那样的标题,能够在 url 中加二个前缀。比方,作者有1个 url 的名字叫做 'comment' ,此时,小编得感觉其加2个前缀,这几个前缀常常是 app 名,举例:'myapp-comment'。

先是明显多少个概念:

  那也是django所推荐的命名格局,不过这样一向是治标不治本。此时,大家将在读书 django 中 url 命名空间了。

一.在html页面上的从头到尾的经过特别是向用户体现的url地址,比方大规模的超链接,图片链接等,最CANON动态变化,而毫不固定.

UTiggoL 命名空间

  简介:

  UHighlanderL 命名空间允许你反查到唯一的命名 U猎豹CS六L,就算在差别的选拔中选拔一样的 U奥迪Q7L 名称。(也正是能够在差异的app中应用同1的称谓,为有命名困难症的技士带来了福音)

  依照经验,第1方使用应该一贯使用带命名空间的U陆风X8L 。类似地,它还同意你在三个施用有多少个实例布置的动静下反查URubiconL。换句话讲,因为3个行使的七个实例共享一样的命名U奥迪Q5L,命名空间将提供一种有别于这么些命名 ULX570L 的形式。

  在四个站点上,准确行使 URL 命名空间的 Django 应用能够配备数次。举例,django.contrib.admin 具备二个 AdminSite 类,它同意你很轻易地配置多少个管理站点的实例。在上边的例子中,大家将琢磨在四个例外的地方安顿教程中的polls 应用,那样大家得感觉三种差别的用户(小编和揭橥者)提供同样的魔法。

2个U奇骏L 命名空间有四个部分,它们都以字符串

 运用命名空间

  它意味着正在布局的采纳的名号。叁个用到的各种实例具备同等的应用命名空间。比方,能够预言Django 的保管站点的利用命名空间是'admin'。

 实例命名空间

  它意味着应用的二个一定的实例。实例的命名空间在你的整个连串中应有是唯一的。不过,一个实例的命名空间能够和行使的命名空间同样。它用于表示1个施用的私下认可实例。举个例子,Django 管理站点实例具备一个私下认可的实例命名空间'admin'

  U酷威L 的命名空间利用':' 操作符钦定。举个例子,管理站点应用的主页使用'admin:index'。它表示'admin' 的三个命名空间和'index' 的贰个命名U奇骏L。

  命名空间也足以嵌套。命名U君越L'sports:polls:index' 将要命名空间'polls'中查找'index',而poll 定义在顶层的命名空间'sports' 中。

 


 

二.一个django项目中貌似蕴涵了多个django应用(app).

反查带命名空间的U凯雷德L

  大家在中等篇中打探到了 url 反查带来的变量,而在中间篇中,皆以行使 name 进行反查,这里来看看哪些对带命名空间的 url 实行反查。

例子:

from django.conf.urls import include, url

urlpatterns = [
    url(r'^author-polls/', include('polls.urls', namespace='author-polls', app_name='polls')),
    url(r'^publisher-polls/', include('polls.urls', namespace='publisher-polls', app_name='polls')),
]

ca88, 

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>d )/$', views.DetailView.as_view(), name='detail'),
    ...
]

 

 反查的措施和中路篇的同等,在模板中:

{% url 'polls:index' %}

 在依据类的视图的方法中:

reverse('polls:index', current_app=self.request.resolver_match.namespace)

  此外,注意,在模板中的反查必要增添 requestcurrent_app 属性,像这样:

def render_to_response(self, context, **response_kwargs):
    self.request.current_app = self.request.resolver_match.namespace
    return super(DetailView, self).render_to_response(context, **response_kwargs)

 

 那时,会有同学有的时候常了, polls 这些动用命名空间设置了两行啊,那 polls 下的 index 到底指的是哪个?

 这年,就要看 django 的查找顺序了:

 一.如果当前有实例,也便是说大家由此 url 访问到了某些处理函数,这几个函数进行反向查询的时候,比如作者访问的是:author-polls/ ,那几个 url 对应的管理函数要举行反向解析,此时它要剖判 'polls:detail'。那么将深入分析到 author-polls/(?P<pk>d )/$ 中,也正是有实例的前期在该实例空间中查询。

 二.一旦未有实例,但是有私下认可的实例空间,例如app_name='polls',namespace='polls' ,和采纳空间同名,那样的就叫做暗许实例空间。在没有访问实例的时候,就合营到暗中同意实例空间中。

 三.借使未有实例,也从不默许实例空间,那么何人是终极注册的就选何人,例子中的 namespace='publisher-polls' 正是最后贰个报了名的(也便是上边的)。

注意:

  因为实例空间假诺并世无两的,所以使用 namespace:name 的格局应该也是独占鳌头匹配的,比如这里的'author-polls:index' 将永生长久分析到 'author-polls' 实例的主页('publisher-polls' 类似)。

 

 


 

三.三个视图(view)往往对应多少个url地址.

USportageL 命名空间和被含有的U陆风X8Lconf

  被含有的UHighlanderLconf 的命名空间能够透过二种艺术钦命。

  首先,在您构造你的U翼虎L 情势时,你能够提供 应用 和 实例的命名空间给 include() 作为参数。举个例子

url(r'^polls/', include('polls.urls', namespace='author-polls', app_name='polls')),

 

  那将富含 polls.urls 中定义的U奥迪Q5L 到使用命名空间 'polls'中,其实例命名空间为'author-polls'

  其次,你可以include 三个涵盖嵌套命名空间数据的靶子。就算您include() 一个url() 实例的列表,那么该对象中含有的USportageL 将助长到全局命名空间。不过,你还足以include() 八个一个要素的元组:

 

(<list of url() instances>, <application namespace>, <instance namespace>)

 

  注意这里的使用命名空间和实例命名空间是倒转的。

  实例:

from django.conf.urls import include, url

from . import views

polls_patterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>d )/$', views.DetailView.as_view(), name='detail'),
]

url(r'^polls/', include((polls_patterns, 'polls', 'author-polls'))),

 

  那样会含有命名的U凯雷德L格局进入到给定的施用和实例命名空间中。

 


 

与 url 相关的函数都在 django.conf.urls 中,上边看看个中都有怎样函数:

1. patterns(prefix, pattern_description, ...) 

  那是1个遗弃了的情势,在 django一.八 在此之前,urlpatterns 变量是该函数的实例。

例如:

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^articles/([0-9]{4})/$', 'news.views.year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'news.views.month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9] )/$', 'news.views.article_detail'),
)

 

首先个参数是1个前缀,这里的富有代表管理函数的字符串都以以 'new.views' 起头的,全部能够改写成上边这种样式:

from django.conf.urls import patterns, url

urlpatterns = patterns('news.views',
    url(r'^articles/([0-9]{4})/$', 'year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9] )/$', 'article_detail'),
)

 

  因为 patterns 是python的二个方法,而 python 中,三个办法最多接受 25五个参数,约等于说最多能够在三个 patterns 中写 255-一 个 url,即便那相似不会有何样影响,因为大家能够通过 include 方法来分别 url,而且以此措施重回的是三个列表,所以能够透过列表拼接的措施,来扩展,比方:

urlpatterns = patterns('',
    ...
    )
urlpatterns  = patterns('',
    ...
    )

 

  所以也只是未来最多一遍性创立多少个 url 而已。

  不过那些法子依然在 一.八 中丢掉了(当然你还可粗鲁用,到 一.九.四截至代码并不曾被移除,今后的本子另算),今后直接选用 python 列表,列表中的成分是 url() 函数的实例就行了。而 python 的列表不限制长度,只看Computer的内部存款和储蓄器有未有丰硕的半空中,所以也好不轻易立异了。

 

2. static.static(prefix, view=django.views.static.serve, **kwargs) 

  假使您通过django的后台上传了一张图片,而你又想在前端突显它。一般而言django 只提供了静态文件的支撑(暗中认可是 /static/ 开头的url请求都视为静态文件请求),而图片上传是通过 MEDIA_URL 来作为

恳请的开端的,不过一旦不做特别装置,是无力回天出示的,此时,能够因此以下的章程:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
]   static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

  那是老版本的写法,新本子中从来把函数放进列表中,作为列表中的3个成分就行

  注意:这里大家并未为 view 传参,直接用暗许的就行。

  当然,那也只是在支付蒙受中动用,要是到了规范生产条件,那么些事物仍然老老实实用 web server ,举个例子Apache或许nginx之类的作为前沿代理,django自带的 web 服务估算并发量在20左右就能够挂掉,而且还不是医生和医护人员进度,相当于说挂掉了不会重启,要多蛋疼有多蛋疼。

 

3. include(arg, namespace=None, app_name=None) 

  arg:能够承受2个字符串,表示被含有的模块在哪个地方;也足以接受一个列表,那么些列表是被含有的 url() 的实例;还足以接受四个元祖,元祖的率先个要素是2个被含有的列表,首个成分是该列表的使用空间名,首个因素是实例空间名。

  namespace : 实例命名空间

  app_name : 应用命名空间

4. url(regex, view, kwargs=None, name=None, prefix='') 

   regex:要协作的 url。

   view:该 url 的管理函数,能够是三个代表函数地方的字符串, 也足以是二个函数的实例。

   kwargs: 二个字典,表示传递多余的参数。

   name : 为 url 实行命名。

   prefix : if prefix: view = prefix '.' view  表示在 view 前增进前缀。

 

5.各种 handler:

  django 自带错误管理视图:

        handler400 = 'django.views.defaults.bad_request'
        handler403 = 'django.views.defaults.permission_denied'
        handler404 = 'django.views.defaults.page_not_found'
        handler500 = 'django.views.defaults.server_error'

  在触及相应的谬误的时候,都会转化暗许的管理函数,当然大家也能够重写它们,唯有在 urls.py 中程导弹入它们,并改写成大家同心同德的处理函数的字符串表示就足以了。

 

在django中完结反向分析U中华VL必备条件正是 url和view能①对一 的相称.

(通过view找到唯一一个相应的url,通过url也能找到唯十一个view)

最 轻易的法子 正是采纳 name,可以精通为url起了一个名字.

例如:

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

urlpatterns = [
 #...
 url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
 #...
]

此时的news-year-archive就足以象征 /articles/nnnn/在view中进行使用.

在templates中使用

<a href="{% url 'news-year-archive' 2012 %}" rel="external nofollow" >2012 Archive</a>

在view中使用

from django.urls import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
 # ...
 year = 2006
 # ...
 return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

不过采纳 name也设有一定的 难题 ,举个例子在同三个品类中的不相同的app中 name大概会重名(导致反深入分析时三个view对应五个url),而且给每一个url起不相同名字也很繁琐.

此刻就能用到 U景逸SUVL命名空间

UEnclaveL命名空间包含八个部分: app_name ( 应用命名空间 )以及 namespace( 实例命名空间 )

对于 app_name合法说明"它意味着正在布局的选择的名目。二个利用的种种实例具有同等的运用命名空间。",相比较好精通.

约等于说能够通过安装 app_name来分别分化app中同名的 name了,使用 :连接.

唯独对于 namespace官方解释"它表示应用的三个一定的实例。 实例的命名空间 在你的百分百 项目中 应该是 唯一的。可是,1个实例的命名空间能够和平运动用的命名空间同样。",就比较的麻烦驾驭.

namespace 首要职能为了区别同1个app下分化实例,使得反剖析url时能得到正确的结果.

例如:

在不加入 namespace 时,访问 和

结果均为 /ccc/aaa/ ,那明摆着不是我们想要获取的结果.

# 主url.py
urlpatterns = [
 ...
 url(r'^bbb/', include("test_namespace2.urls")),
 url(r'^ccc/', include("test_namespace2.urls")),
 ...
]

# test_namespace2/url.py
app_name = "app02"

urlpatterns = [
 url(r'aaa/$', views.aaa, name="index"),
]

# test_namespace2/view.py
def aaa(request):
 return HttpResponse(reverse("app02:index"))

做出一些改造,到场 namespace用作区分

# 主url.py
urlpatterns = [
 ...
 url(r'^bbb/', include("test_namespace2.urls", namespace='bbb')), # 加入了namespace
 url(r'^ccc/', include("test_namespace2.urls", namespace='ccc')),
 ...
]

# test_namespace2/view.py
def aaa(request):
 return HttpResponse(reverse("app02:index", current_app=request.resolver_match.namespace)) # 使用namespace

那般就能够获取不错的结果了.

选择办法:

首先在,主url.py中添加 namespace

urlpatterns = [
 url(r'^polls/', include('polls.urls',namespace='test')),
]

下一场要在app的urls.py中增加 app_namename

比如:

app_name = 'polls'
urlpatterns = [
 #...
 url(r'^$', views.index, name='index'),
 #...

下一场在view和templates中央银行使了,此时就算有七个app中都深入人心为 index 的 name 也不会有标题了

使用方式,使用形如 app_name:name

在view中使用:

reverse('polls:index', current_app=request.resolver_match.namespace)

在templates中使用

{% url 'polls:index' %}

如上正是本文的全部内容,希望对大家的求学抱有协助,也可望我们多多援救脚本之家。

你可能感兴趣的篇章:

  • Django ULX570L传递参数的艺术总括
  • Django中U科雷傲L视图函数的壹部分高等概念介绍
  • 在Django的URubiconLconf中选择命名组的办法
  • Python中Django框架利用url来决定登陆的主意
  • 在Django的U福特ExplorerLconf中央银行使四个视图前缀的措施
  • 在Django的U猎豹CS6Lconf中开展函数导入的格局
  • 获得Django项目标成套url方法详解
  • Python的Django框架中从url中捕捉文本的主意
  • Python的Django框架中UWranglerLconf相关的一些本事整理
  • Django框架完成逆向剖判url的不二法门

编辑:ca88 本文来源:django反向解析URL和URL命名空间的方法,django反向

关键词: 亚洲城ca88