跳转到主要内容

用于操作URL的Django模板库。

项目描述

          .=.,
         ;c =\
       __|  _/
     .'-'-._/-'-._
    /..   ____    \
   /  {% spurl %}  \
  (  / \--\_>/-/'._ )
   \-;_/\__;__/ _/ _/
    '._}|==o==\{_\/
     /  /-._.--\  \_
    // /   /|   \ \ \
   / | |   | \;  |  \ \
  / /  | :/   \: \   \_\
 /  |  /.'|   /: |    \ \
 |  |  |--| . |--|     \_\
 / _/   \ | : | /___--._) \
|_(---'-| >-'-| |       '-'
       /_/     \_\
https://img.shields.io/pypi/v/django-spurl.svg https://img.shields.io/pypi/dm/django-spurl.svg https://img.shields.io/github/license/j4mie/django-spurl.svg https://img.shields.io/travis/j4mie/django-spurl.svg https://coveralls.io/repos/github/j4mie/django-spurl/badge.svg?branch=develop

Spurl 是一个用于操作URL的Django模板库。它建立在 Zachary Voase 的优秀项目 urlobject 之上。

Jamie Matthews 编写,以及一些出色的 贡献者

安装

要么从GitHub检出 spurl,要么使用pip安装

pip install django-spurl

spurl 添加到您的 INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'spurl',
)

最后,无论何时您想在模板中使用Spurl,您都需要加载其模板库

{% load spurl %}

用法

Spurl不是Django内置的{% url %}模板标签的替代品。它是一个用于在模板中操作URL组件的通用工具包。如果您喜欢,可以与{% url %}一起使用(见下文)。

Spurl提供了一个名为(令人惊讶的是),spurl的单个模板标签。您可以通过一组key=value关键字参数来调用它,这些参数的详细描述如下。

为了展示Spurl的一些功能,我们将讨论几个简单的示例用例。

向URL添加查询参数

假设您的数据库中有一系列外部URL。当您在模板中创建指向这些URL的链接时,需要为每个URL添加一个referrer=mysite.com查询参数。简单的方法可能是

{% for url, title in list_of_links %}
    <a href="{{ url }}?referrer=mysite.com">{{ title }}</a>
{% endfor %}

这里的问题是您事先不知道数据库中存储的URL是否已经存在查询参数。如果有,您将生成不完整的链接,如http://www.example.com?foo=bar?referrer=mysite.com

Spurl可以解决这个问题。因为它知道URL的组件,所以它可以在现有查询上添加参数(如果有的话)。

{% for url, title in list_of_links %}
    <a href="{% spurl base=url add_query="referrer=mysite.com" %}">{{ title }}</a>
{% endfor %}

请注意,当您将字面字符串传递给Spurl时,必须将其用双引号括起来。如果不这样做,Spurl将假设它是一个变量名,并尝试在模板的上下文中查找它。

敏感的SSL外部URL。

假设您的网站需要显示一个来自某些第三方Web API的图片画廊,这些图片的URL已经生成。此外,想象一下您的网站需要在安全和非安全模式下运行 - 相同的内容在httpshttp URL上都可以使用(取决于访客是否已登录,例如)。如果显示的页面是https,而某些资源是http,一些浏览器会大声抱怨(向用户显示“混合内容警告”)。Spurl可以解决这个问题。

{% for image_url in list_of_image_urls %}
    <img src="{% spurl base=image_url secure=request.is_secure %}" />
{% endfor %}

这将使用您提供的图像URL,并根据request.is_secure()的返回值替换方案组件(httphttps部分)。请注意,上面的代码假设您正在使用RequestContext,这样request就可以在您的模板中使用。

{% url %}一起使用

请注意,Spurl的功能与Django内置的{% url %}标签不重叠。Spurl不知道您的urlconf,也不执行任何URL反转。实际上,Spurl主要用于操作外部URL,而不是您网站上的URL。但是,如果您需要,可以很容易地将Spurl与{% url %}一起使用。您只需使用as关键字将反转的URL放在模板变量中,然后将它传递给Spurl。由于它是一个相对路径(而不是完整的URL),您应该使用path参数传递它。例如,假设您想向您网站上的URL追加一些查询参数

{% url your_url_name as my_url %}
<a href="{% spurl path=my_url query="foo=bar&bar=baz" %}">Click here!</a>

使用Spurl与{% url %}还有另一种方法,请参见下文的《嵌入模板标签》。

可用参数

以下是Spurl理解的所有参数的完整列表。

base

如果您将base参数传递给Spurl,它将解析其内容,并使用此作为基础URL,所有其他参数都将在此URL上操作。如果您没有传递base参数,Spurl将根据您单独传递的组件从头开始生成URL。

scheme

设置URL的方案组件。示例

{% spurl base="http://example.com" scheme="ftp" %}

这将返回ftp://example.com

另请参阅下方的 scheme_from

主机

设置URL的主机部分。示例

{% spurl base="http://example.com/some/path/" host="google.com" %}

这将返回 http://google.com/some/path/

另请参阅下方的 host_from

认证

处理HTTP基本认证,用户名和密码可以包含在URL中。示例

{% spurl base="https://example.com" auth="user:pass" %}

这将返回 https://user:pass@example.com

路径

设置URL的路径部分。示例

{% spurl base="http://example.com/some/path/" path="/different/" %}

这将返回 http://example.com/different/

另请参阅下方的 path_from

添加路径

向现有路径追加路径部分。您可以多次调用 add_path,并将每次的结果合并。示例

{% spurl base=STATIC_URL add_path="javascript" add_path="lib" add_path="jquery.js" %}

这将返回 http://cdn.example.com/javascript/lib/jquery.js (假设 STATIC_URL 设置为 http://cdn.example.com

另请参阅下方的 add_path_from

片段

设置URL的片段部分。示例

{% spurl base="http://example.com" fragment="myfragment" %}

这将返回 http://example.com/#myfragment

另请参阅下方的 fragment_from

端口

设置URL的端口部分。示例

{% spurl base="http://example.com/some/path/" port="8080" %}

这将返回 http://example.com:8080/some/path/

另请参阅下方的 port_from

查询

设置URL的查询部分。示例

{% spurl base="http://example.com/" query="foo=bar&bar=baz" %}

这将返回 http://example.com/?foo=bar&bar=baz

查询参数也可以是来自您模板上下文的字典。

# views.py
def my_view(request):
    my_query_params = {'foo': 'bar', 'bar': 'baz'}
    return render(request, 'path/to/template.html', {'my_query_params': my_query_params})
<!-- template.html -->
{% spurl base="http://example.com/" query=my_query_params %}

这将返回 http://example.com/?foo=bar&bar=baz

最后,您可以将单个模板变量传递给查询。为此,Spurl使用Django的模板系统。例如

{% spurl base="http://example.com/" query="foo={{ variable_name }}" %}

另请参阅下方的 query_from

添加查询

向现有查询追加一组参数。如果基本URL可能已经包含查询组件,这将合并现有参数和新的参数。示例

{% spurl base="http://example.com/?foo=bar" add_query="bar=baz" %}

这将返回 http://example.com?foo=bar&bar=baz

您可以多次添加 add_query 调用,并将每次的结果合并。

{% spurl base="http://example.com/" add_query="foo=bar" add_query="bar=baz" %}

这将返回 http://example.com?foo=bar&bar=baz

与上面的 query 参数一样,传递给 add_query 的值也可以是字典,并且它们可以包含Django模板变量。

另请参阅下方的 add_query_from

设置查询

向现有查询追加一组参数,用同名参数覆盖现有参数。否则使用与 add_query 完全相同的语法。

另请参阅下方的 set_query_from

切换查询

在两个可能的值之间切换一个或多个查询参数的值。当重新排序列表视图时非常有用。示例

{% spurl base=request.get_full_path toggle_query="sort=ascending,descending" %}

如果 request.get_full_path() 的值没有 sort 参数,将添加一个具有 ascending(列表中的第一个项是默认值)值的参数。如果它已经有一个 sort 参数,并且当前设置为 ascending,则将其设置为 descending。如果它已经设置为 descending,则将其设置为 ascending

您还可以指定选项为字典,将参数名称映射到包含要切换的值的两个元组。

# views.py

SORT_PARAM = 'sort'
ASCENDING = 'ascending'
DESCENDING = 'descending'

def my_view(request):

    if request.GET.get(SORT_PARAM, ASCENDING) == DESCENDING:
        object_list = MyModel.objects.order_by('-somefield')
    else:
        object_list = MyModel.objects.order_by('somefield')

    return render(request, 'path/to/template.html', {
        'object_list': object_list,
        'sort_params': {SORT_PARAM: (ASCENDING, DESCENDING)},
    })
<!-- template.html -->
<a href="{% spurl base=request.get_full_path toggle_query=sort_params %}">Reverse order</a>

删除查询参数

从现有查询中删除查询参数

{% spurl base="http://example.com/?foo=bar&bar=baz" remove_query_param="foo" %}

这将返回 http://example.com?bar=baz

再次,您可以添加多个 remove_query_param 调用,结果将合并

{% spurl base="http://example.com/?foo=bar&bar=baz" remove_query_param="foo" remove_query_param="bar" %}

这将返回 http://example.com/

您还可以删除具有特定值的参数

{% spurl base="http://example.com/?foo=bar&bar=baz&foo=baz" remove_query_param="foo" remove_query_param="foo=baz" %}

这将返回 http://example.com/?bar=baz

最后,您可以向 remove_query_param 调用传递单个模板变量。为此,Spurl 使用 Django 的模板系统。例如

{% spurl base="http://example.com/?foo=bar&bar=baz" remove_query_param="{{ variable_name }}" %}

secure

控制生成的 URL 是否以 httphttps 开头。此参数的值可以是布尔值(TrueFalse),如果您使用上下文变量。如果您在此处使用字面量参数,它必须是一个引号字符串。字符串 "True""on"(不区分大小写)将被转换为 True,任何其他字符串将被转换为 False。示例

{% spurl base="http://example.com/" secure="True" %}

这将返回 https://example.com/

autoescape

默认情况下,Spurl 将以与 Django 模板系统相同的方式转义其输出。例如,URL 中的 & 字符将渲染为 &amp;。您可以通过传递一个 autoescape 参数来覆盖此行为,该参数必须是布尔值(如果从模板变量传递)或字符串。字符串 "True""on"(不区分大小写)将被转换为 True,任何其他字符串将被转换为 False

额外优势:_from 参数

除了上面列出的之外,Spurl 还提供了一系列用于 合并 URL 的参数。给定一个起始的基本 URL,您可以从另一个 URL 复制一个组件。这些参数期望传递完整的 URL(或任何可以被 URLObject.parse 理解的东西)。此 URL 将被解析,然后提取相关组件并将其与基本 URL 合并。

以下是可用的完整 _from 方法列表。它们的语义与其上面的对应项相同(除了它们期望完整的 URL,而不仅仅是 URL 组件)。

  • query_from

  • add_query_from

  • set_query_from

  • scheme_from

  • host_from

  • path_from

  • add_path_from

  • fragment_from

  • port_from

示例

{% spurl base="http://example.com/foo/bar/?foo=bar path_from="http://another.com/something/?bar=foo" %}

这将返回 http://example.com/something/?foo=bar

构建 URL 而不显示它

与 Django 的 {% url %} 标签一样,Spurl 允许您将生成的 URL 插入到模板的上下文中以供以后使用。示例

{% spurl base="http://example.com" secure="True" as secure_url %}
<p>The secure version of the url is {{ secure_url }}</p>

嵌入模板标签

如上所述,Spurl 使用 Django 的模板系统来分别解析可以传递字符串的任何参数。这允许使用如下的语法

{% spurl base="http://example.com" add_query="foo={{ bar }}" %}

这对于变量和过滤器工作得很好,但如果我们想在 Spurl 标签 内部 使用其他模板标签怎么办?我们不能嵌套 {%%} 标记,因为 Django 的模板解析器会非常困惑。相反,我们必须使用反斜杠转义内部的一组标签标记

{% spurl base="http://example.com" add_query="next={\% url home %\}" %}

请注意,您模板中加载的任何标签或过滤器都自动可用在用于渲染每个变量的嵌套模板中。这意味着我们可以这样做

{% load url from future %}
{% spurl base="{\% url 'home' %\}" %}

小心你的引号!如果你用双引号包围嵌套模板,你必须在其中使用单引号。

警告! 此功能仅存在以服务于最复杂的用例,非常神奇(可能不是一个好主意)。你可能更喜欢使用

{% url "home" as my_url %}
{% spurl base=my_url %}

开发

要贡献,请克隆仓库,进行更改,添加一些测试,提交,推送,并打开一个拉取请求。

如何运行测试

Spurl 使用 nose 进行测试。克隆仓库,然后运行 pip install -r requirements.txt 以将 nose 和 Django 安装到你的虚拟环境中。然后,只需输入 nosetests 即可查找并运行所有测试。

(取消)许可

这是一个免费且无负担的软件,已发布到公共领域。

任何人都可以免费复制、修改、发布、使用、编译、销售或以任何方式分发此软件,无论是源代码形式还是编译的二进制形式,无论目的是商业还是非商业。

在承认版权法的司法管辖区,该软件的作者或作者将此软件的任何和所有版权利益奉献给公共领域。我们做出这种奉献是为了公共利益,损害我们的继承人和继任者的利益。我们打算将此奉献视为一项明示的永久放弃,放弃根据版权法对软件的所有现有和未来权利。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定用途和侵权不保证。在任何情况下,作者都不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式,由软件或其使用或其他交易引起。

有关更多信息,请参阅 http://unlicense.org/

艺术作品归属

超人 ASCII 艺术来自 http://ascii.co.uk/art/superman

变更

0.6.8 (2021-11-15)

  • 修复 toggle_query 支持当一词是另一词的片段时。

0.6.7 (2020-05-22)

  • 修复了 MANIFEST.in

0.6.6 (2019-03-29)

  • 添加了对移除除指定查询变量之外的所有查询变量的 except 子句的支持。

0.6.5 (2018-05-09)

  • 添加了对 Django 2.x 的支持,并取消了对旧版和非 LTS 版本 Django 的支持。

0.6.4 (2015-12-26)

  • 为 Django 1.10 发布做准备。

  • 取消了对 Django 1.3 及更早版本的支持。

0.6.3 (2015-12-17)

  • Django 1.9 兼容(Albert Koch)

0.6.2 (2015-09-17)

  • remove_query_param 添加了对模板变量的支持。

  • 处理认证参数,以便将用户名:密码添加到 URL 中。

0.6.1 (2015-07-14)

  • Python 3 兼容!

0.6.0 (2012-02-23)

  • 将 URLObject 依赖项升级到 2.0

0.5.0 (2011-12-14)

  • 修复了更改日志中的错误。

  • 为组合 URL 添加了 _from 参数族。

  • 添加了 toggle_query 参数。

0.4.0 (2011-12-07)

  • 将 URLObject 依赖项升级到 0.6.0

  • 添加了 remove_query_param 参数。

  • 添加了对嵌入在参数值中的模板标签的支持。

  • 大规模重构。

0.3.0 (2011-08-18)

  • 添加了 set_query 参数。

0.2.0 (2011-08-08)

  • 添加了 as 参数,以将生成的 URL 插入模板上下文中。

0.1.0 (2011-07-29)

  • 初始发布。

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定要选择哪一个,请了解更多关于 安装软件包 的信息。

源代码发行版

django-spurl-0.6.8.tar.gz (14.9 kB 查看哈希值)

上传时间 源代码

构建发行版

django_spurl-0.6.8-py3-none-any.whl (13.7 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页