2011-09-02 2 views
4

URL에 인코딩 된 문자열을 전달하라는 요청을 받고 싶습니다. 예를 들면 :web2py 요청에서 % 20 허용 args

/application/controller/function/hello%20world 

그래서 request.args에 액세스하고 내가 맺다 수있는 문자열을 얻을 수 있습니다 내 기능에 그().

% 20을 (를) 변환하지 않으려 고 rewrite.py를 수정했지만 오류가 발생했습니다. 뭔가 다른 곳에서 이러한 문제를 발견하면 문제가 발생합니다. httpserver.log 파일의 내용은 다음과 같습니다.

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

이미 변환 된 공간. 어쩌면 그것은 힌트를줍니다. URL의 인코딩이 해제되는 위치는 어디입니까?

다음은 내 경로의 내용이 파일은 다음과 같습니다 기본적으로

#!/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를 제외하고 인수에 특수 문자를 허용하지 않습니다 '@', '-', '='및 '.'. 이 동작을 재정의하려면 추가 할 수있는 routes.py에 다음과 같은 :이 경우

routes_apps_raw=['chips'] 

, request.args는 None로 설정되고, 대신 당신은 request.raw_args를 통해 URL에서 원시 인수에 액세스 할 수 있습니다. 하지만 parameter-based rewrite system을 사용하는 경우 routes_apps_raw이 작동하지 않습니다 (즉, routes.py 파일에 routers 사전이있는 경우).

위의 변경 사항이 있더라도 web2py에 포함 된 Rocket 웹 서버는 여전히 URL이 자동으로 unquote()이므로 request.raw_args에 특수 문자가 표시되지만 이미 디코딩됩니다.

매개 변수 기반 다시 쓰기 시스템을 대신 사용하는 경우 정규 표현식을 값으로 사용하는 args_match 키를 통해 URL args에서 허용되는 문자를 제어 할 수 있습니다. 기본 정규식은 '@', '-', '='및 '.'을 허용하는 r'([\[email protected] -]|(?<=[\[email protected] -])[.=])*$'입니다. ('='및 '.'에 대한 몇 가지 제한 사항이 있음).

+0

허용되는 문자 목록이 이제 다음 정규 표현식과 일치하는 것으로 변경되었습니다. r '([\ w @ -] | (? <= [\ w @ -]) [. =]) * $ – user2667066

+0

허용 된 문자는 변경되지 않았습니다. arg에서 "@"또는 "-"를 사용할 수 있지만 "="또는 "."는 사용할 수 없습니다. arg의 끝에서만 (유일한 문자가 아닌 한). – Anthony

+0

예, 문자는 같지만 허용되는 위치가 다릅니다 - 이제는 = 또는를 가질 수 있습니다. arg 자체 내에서, 그리고 regexp가 허락하는 것입니다. '$ ','abcd = efgh ')' – user2667066