Django:如何将整个URL作为参数传递到应用程序URL中?

时间:2015-01-31 09:25:45

标签: python django django-views django-urls

我试图在我的应用中传递一个完整的全长/结构URL作为应用程序URL中的参数。例如,我希望能够做到这样的事情: myapp.com/https://www.youtube.com/watch?v=dQw4w9WgXcQ这样我就可以在我的应用主页后面输入并存储它。但是,我认为当粘贴的URL包含片段和查询参数时,应用程序会变得混乱(即:包含#和/或?)我的urls.py看起来像这样:

url(r'^(?P<url_param>[a-zA-Z0-9_.-/:?=#]*)/$', views.anywebsiteentered, name='anywebsiteentered')

当我尝试编写一个如下所示的视图来获取输入的URL并将其保存在模型对象中时,我总是在查询和片段字符之前截断URL,我可以做什么以便我的应用程序选择整个URL字符串?

def anywebsiteentered(request, url_param = 'url_param'):
    UrlBlob.objects.create(fullurl=url_param)

例如,如果我的应用位于myapp.com/https://www.youtube.com/watch?v=dQw4w9WgXcQ,则创建的上述对象仅返回https://www.youtube.com/watch而不是URL的查询部分。我怀疑这是我在传递URL时所做的事情,因为当我在python-django shell中手动创建这个模型对象时,根本没有任何问题。

感谢您提供任何帮助和提示。对此,我真的非常感激。

2 个答案:

答案 0 :(得分:1)

如果你需要在另一个网址的“路径”区域使用某个网址,你应该逃避它的特殊字符。例如,使用%3F代替“?”。它被称为url escaping。

为了您的目的,最好将url作为参数传递:

myapp.com/?url=http://www.youtube.com/watch?v=dQw4w9WgXcQ

- 在这种情况下,浏览器将进行必要的转义。

答案 1 :(得分:1)

您可以从request.META获取查询字符串:

def anywebsiteentered(request, url_param='url_param'):

    full_url = url_param
    query_string = request.META['QUERY_STRING']
    if query_string:
        full_url += u'?' + query_string

    UrlBlob.objects.create(fullurl=full_url)