允许完全重写django url(系统url的别名)

django_url_alias的Python项目详细描述


====
django_url_alias
==


about
----


(url解析)和传出的url(通过{%url…%}或"resolve")执行此操作。url重写是模块化的,因此您可能有静态的
重写(就像设置中的dict)和基于数据库的重写。您甚至可以通过使用多个url
重写器来混合这两种类型。

这样它就可以重写所有传入的url,这样就可以解析其他视图了。

django_url_alias提供了一个特殊的{%url%}模板标记,并且
它自己版本的"reverse"。如果你用这些,一切都会好起来的。遗憾的是,没有一种明智的方法可以取代django的默认行为。

usecase
----


尽管django的url处理非常好,但可能有一些scanarios是它无法处理的。flatpage应用程序是一个
例子,如果你需要catchall模式,url处理会变得很奇怪。当多个应用程序需要类似的机制(catchall模式)时,这仍然适用于运行
遇到问题的平面页面,因为只有第一个应用程序将被正确处理
(url匹配,进一步的urlconf条目将被忽略)。

实现大url结构的不同方法。他们没有使用易于阅读的系统/内部url,而是将抽象层放在所有url处理之上。这意味着您的
博客条目(例如)可能仍然有一个丑陋的(内部)url,如"blog/entry/15"。现在,新的url层将
接受那个难看的url,并允许用户或系统定义别名。例如,别名可以将"blog/entry/15"
重写为"my trip to paris.html"。在处理输入url时,需要颠倒,因此请求的url
"my trip to paris.html"将再次解析为"blog/entry/15"。

django_url_alias允许您准确地执行此操作。因为它没有为重写url提供任何预定义的规则/机制,所以您可以自由使用任何规则。理论上,您甚至可以重用好的旧"slugfield"和正则表达式。当然,您也可以像许多系统一样使用基于数据库的映射。下面您将发现
一个flatpages示例,不需要catchall模式。

在python'sys.path`(`pip install django_url_alias`)中获取django_url_alias
。将"settings.root_urlconf"替换为"django_url_alias.url"`
。将旧的根urlconf放入"settings.url_alias_root_urlconf`
使用"settings.url_alias_modules"定义URL重写模块
(请参见https://github.com/ddanier/django_url_alias/blob/master/example/example/url_aliases.py
和下面的示例)
。将{%load url_alias%}放入模板中,这样{%url%}将被替换
。使用python代码中的"django-url-alias.resolver.reverse"关于url-alias模块
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


url-alias模块只是一个简单类的列表,用于重写django句柄或生成的url。

代码::python

url_alias_modules=(
'path.to.module.aliases.exampleliasmodule',


>每个类都将在没有任何参数的情况下实例化,并且应该提供两种方法:

*resolve(self,path):更改传入的url
*reverse(self,path):change传出url

一个简单的示例可能如下所示::


类示例urlAliasmodule(object):
def resolve(self,path):
如果path='foo/':
return'bar/'

def reverse(self,path):
如果path='bar/':
return'foo/'


不执行重写时,两个方法都不能返回任何内容(/none)。将为
传入和传出URL调用定义的类。返回替换url的第一个模块将简化进一步的处理,因此
将定义最终的url。


flatpage示例
----


flatpages应用程序位于核心,因此它只是给出了一个很好的示例。我们不想再使用catchall模式了。
要使本示例生效,您需要先完成安装。

首先,我们需要定义内部url结构。您的访问者将看不到这一点,尽管
内部URL仍然可以访问。

url.py::python

url(r'^flatpage/(?p<;pk>;[0-9]+)/$','example.views.flatpage',name='flatpage'),



然后需要重写,因此将使用"flatpage.url"来表示外部url结构,而
内部使用基于id的url。

url重写模块::python

从django.contrib.flatpages.models导入flatpage
import re

class flatpagesurlaliasmodule(对象):
flatpage_re=re.compile('^/flatpage/(?p<;pk>;[0-9]+)/$')


def resolve(self,path):
path='/'+path我们需要flatpages的尾随斜杠
尝试:
flatpage=flatpage.objects.get(url=path)
return'/flatpage/%d/'%flatpage.pk
except flatpage.doesnotexist:
pass不返回任何内容


def reverse(self,path):
match=self.flatpage re.match(path)
如果match:
尝试:
flatpage=flatpage.objects.get(pk=match.group('pk'))
返回flatpage.url
除了flatpage.doesnotexist:
pass不返回任何内容

*注意:*这只是一个示例。在生产环境中,您需要a)检查站点关系,更重要的是b)使用一些缓存。上述代码效率很低,不应在生产环境中使用。





您可以使用中间件类重写URL,这些类处理"request.path_info"
,但这样会丢失信息(甚至更糟的是:重写信息)。
*最不显眼的实现方式。

rls不会被搜索引擎索引。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法使用JSF访问托管bean方法   java是制作具有多值类型的HashMap的正确方法   javafx中TicTacToe的java更新UI   windows Java文件。getCanonicalFile()无法处理冒号“:”   java在一个布局屏幕中创建多个(26)按钮   java Android Studio:Gradle构建完成,有251个错误   我们如何在Java上为callfireapiclient编写单元/集成测试?   java无法将1715UTC转换为本地/gmt类型   具有已定义的数字序列的JAVA循环   Java程序正在netbeans中编译,但未在CMD中编译,包不存在   java Android构造函数和onCreate()之间有什么区别?   java配置弹性搜索结果评分   java LibGDX纹理是否可绘制?   java如何在Android中设置应用程序默认打开pdf   java是否有一种创造性的方法将多个参数传递给contentEquals()方法?   java在Android上存储Ed25519私钥