我试图在我的应用中传递一个完整的全长/结构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中手动创建这个模型对象时,根本没有任何问题。
感谢您提供任何帮助和提示。对此,我真的非常感激。
答案 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)