2011-09-02 71 views
4

我试图让请求传递URL中的编码字符串。例如:在web2py请求中允许%20 args

/application/controller/function/hello%20world 

因此,在我的函数中,我可以访问request.args并获取一个可以取消引号()的字符串。

我试着修改rewrite.py来不转换%20但是导致了一些错误。还有一些东西是在我无法找到的地方捕捉到这些请求。我注意到httpserver.log文件有:

127.0.0.1, 2011-09-02 00:12:09, GET, /application/controller/function/hello world, HTTP/1.1, 200, 0.169954 

已经转换的空间。也许这提供了一个提示。网址在哪里得到未编码?

下面是我的路线文件的内容:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

default_application = 'chips' 
default_controller = 'default' 
default_function = 'index' 


routes_onerror = [ 
    (r'*/404', r'/chips/static/404.html') 
    ,(r'*/*', r'/chips/static/error.html') 
] 
+1

你使用的是routes.py吗?如果是这样,你使用基于参数的系统还是基于模式的系统? – Anthony

+0

我只使用路由来更改默认应用程序。我不确定我使用的是哪种类型的系统。 –

+0

routes.py文件的内容是什么? – Anthony

回答

2

默认情况下,web2py会不会允许除ARGS特殊字符 '@', ' - ', '=' 和 ''。重写该行为,您可以添加以下routes.py:

routes_apps_raw=['chips'] 

在这种情况下,request.args中会被设置为None,而是可以从URL通过request.raw_args访问原始ARGS。但请注意,如果您使用parameter-based rewrite system(即,如果您的routes.py文件包含routers字典),则routes_apps_raw不起作用。

请注意,即使进行了上述更改,web2py附带的Rocket网络服务器仍会自动unquote()网址,因此您将获得request.raw_args中的特殊字符,但它们已被解码。

如果您改为使用基于参数的重写系统,则可以通过args_match关键字控制URL参数中允许哪些字符,该关键字采用正则表达式作为其值。默认的正则表达式是r'([\[email protected] -]|(?<=[\[email protected] -])[.=])*$',它允许'@',' - ','='和'。' (对'='和'。'有一些限制)。

+0

请注意,允许的字符列表现在似乎已经更改为匹配以下正则表达式的字符:r'([\ w @ - ] |(?<= [\ w @ - ])[。=])* $ – user2667066

+0

不,允许的字符没有改变 - 你可以在“arg”的任意位置有“@”或“ - ”,但是“=”或“。”。只有在arg结尾(只要这些不是唯一的字符)。 – Anthony

+0

是的,字符是一样的,但允许的位置是不同的 - 我现在可以有=或。在arg本身内,这就是正则表达式所允许的。试试're.match(r'([\ w @ - ] |(?<= [\ w @ - ])[。=])* $','abcd = efgh')' – user2667066