允许完全重写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不会被搜索引擎索引。
django_url_alias
==
about
----
重写(就像设置中的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
)
然后需要重写,因此将使用"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不会被搜索引擎索引。