什么是Djnago的url模式匹配并获取一个url(作为GET请求附加到网站的域)?

时间:2017-10-29 09:05:25

标签: django python-3.x django-urls

假设我的网站的域名是mysite.com,现在每当有这样的请求时出现:mysite.com/ {{}}}:我想取出这个网址“https://stackoverflow.com”并将其发送给相应的观点。

我尝试过这种模式:

URL(R'^(P< preurl> HTTP [S]://(:???[A-ZA-Z] | [0-9] | [$ -_ @&安培; +] | [*(),!] |(?:%[0-9A-FA-F] [0-9A-FA-F]))+)$”,prepend_view)

正则表达式与传入的附加网址匹配,并为变量预先设置值“https://stackoverflow.com”,我在相应的视图函数中访问该值。

这适用于上面的示例但我的网址模式在某些特殊网址的情况下失败了.. 请考虑所有特殊网址,建议一个强大的网址模式,如下所示:

 ftp://ftp.is.co.za/rfc/rfc1808.txt

  http://www.ietf.org/rfc/rfc2396.txt

  ldap://[2001:db8::7]/c=GB?objectClass?one

  mailto:John.Doe@example.com

  news:comp.infosystems.www.servers.unix

  tel:+1-816-555-1212

  telnet://192.0.2.16:80/

  urn:oasis:names:specification:docbook:dtd:xml:4.1.2

也就是说,如果请求如下: mysite.com/ldap://?[2001:DB8 :: 7] / C = GB objectClass的一个

我应该能够在变量preurl中获得值“ldap:// [2001:db8 :: 7] / c = GB?objectClass?one”

1 个答案:

答案 0 :(得分:1)

您不必制作此类复杂的网址格式。首先,制作一个与所有内容匹配的网址格式。

url(r'^.*/$', views.fast_track_service, name='fast_track'),

并将其附加到url中的urlpatterns中,然后在您的视图中使用请求对象,这样您就可以使用此方法获取get请求的完整路径,

fast_track_url = request.get_full_path()[1:]

然后一旦你获得了url,请尝试使用URLValidator进行验证。

if not 'http://' in fast_track_url and not 'https://' in fast_track_url:
        fast_track_url = 'http://' + fast_track_url
url_validate = URLValidator()
try:
    url_validate(fast_track_url)
except:
    raise Http404

如果您想验证其他复杂的URL,例如mailto等,那么您可以编写自己的验证器。