2011-09-02 72 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