2015-08-15 3 views
1

RESTful routing в Python, похоже, не работает. Например,RESTful Python Маршруты - не работает?

# Setup a mapper 
from routes import Mapper 
map = Mapper() 
map.connect("add user", "/user", controller = "addUser", action = "add", 
    conditions=dict(method=["GET"])) 
map.connect("post user", "/user", controller = "postUser", action = "post", 
    conditions=dict(method=["POST"])) 
map.connect("update user", "/user/{id}", controller = "updateUser", action = "update", 
    conditions=dict(method=["GET"])) 
map.connect("put user", "/user/{id}", controller = "putUser", action = "put", 
    conditions=dict(method=["PUT"])) 
map.connect("delete user", "/user/{id}", controller = "deleteUser", action = "delete", 
    conditions=dict(method=["DELETE"])) 
map.connect("home", "/", controller = "main", action = "index", conditions=dict(method=["GET"])) 

# This is our application object. It could have any name, 
# except when using mod_wsgi where it must be "application" 
def application(environ, start_response): 

    # Get the request uri. 
    uri = environ.get('PATH_INFO', '') 
    req = uri if uri else '/' 

    # Match a URL, returns a dict or None if no match 
    mapped = map.match(req) 
    print mapped 

    # Everything done, return the response: 
    if mapped['action'] == 'index' : 
     response_body = index(environ, start_response, mapped) 
    elif mapped['action'] == 'add': 
     response_body = add(environ, start_response, mapped) 
    elif mapped['action'] == 'put': 
     response_body = put(environ, start_response, mapped) 
    elif mapped['action'] == 'delete': 
     response_body = delete(environ, start_response, mapped) 
    else: 
     response_body = "Not exist." 

    status = '200 OK' 

    response_headers = [('Content-Type', 'text/html'), 
       ('Content-Length', str(len(response_body)))] 
    start_response(status, response_headers) 

    return [response_body] 

Это не заботится метод REST ли PUT, DELETE или POST. Это ищет толькоматч из /user/{id} в моем url.

Так что, когда я посылаю метод УДАЛИТЬ с http://127.0.0.1/index.py/user/1

Я всегда получаю {'action': u'update', 'controller': u'updateUser', 'id': u'1'}, который является GET из map.connect("update user", "/user/{id}", controller = "updateUser", action = "update", conditions=dict(method=["GET"]))

Любые идеи, что я сделал не так?

EDIT

Apache конфигурационный файл,

LoadModule wsgi_module modules/mod_wsgi.so 

.... 

<VirtualHost 127.0.0.1> 
    DocumentRoot "${path}/data/localweb" 
    ServerName 127.0.0.1 
    <Directory "${path}/data/localweb"> 
     Options FollowSymLinks Indexes ExecCGI 
     AllowOverride All 
     Order deny,allow 
     Allow from 127.0.0.1 
     Deny from all 
     Require all granted 
    </Directory> 
    WSGIScriptAlias/C:\...\wsgi\route\basic\index.py 
</VirtualHost> 

Кстати, в моем журнале ошибок Apache, я всегда получаю это wsgi:error предупреждение с напечатанным результате

[Сб августа 15 16: 03: 41.871541 2015] [wsgi: error] [pid 7068: tid 836] {'action': u'update ',' controller ': u'updateUser', 'id': u'1 '}

+0

"http://127.0.0.1/index.py/user/1" не равно "http://127.0.0.1/user/1". Вы работаете с неправильным индексом. Индекс каталога .py (какой каталог вы хотите, чтобы он был). Подобные ошибки также поддерживались Django. URL-адрес не должен быть вашим именем сценария в теге. В противном случае регион изменится. – dsgdfg

+0

Внешний вид '' index.py'' может быть артефактом того, как mod_wsgi был настроен. В частности, что '' WSGIScriptAlias'' может использоваться в каталоге, а не в определенном файле сценария WSGI, или что использовался метод настройки «AddHandler» для настройки mod_wsgi. «SCRIPT_NAME'» или точка монтирования для приложения обычно должны быть установлены правильно, а '' PATH_INFO'' должен включать только ''/user/... '', который должен соответствовать WSGI-приложению. OP должен предоставить свою конфигурацию Apache/mod_wsgi. –

+0

@SDilmac - это тот же результат с 'http: // 127.0.0.1/user/1', который является' {'action': u'update ',' controller ': u'updateUser', 'id': u ' 1 '} '. – laukok

ответ

0

Я думаю, что это может быть ответ от http://pylonsbook.com/en/1.0/urls-routing-and-dispatch.html который очень похож на то, что я делаю,

map.connect("add user", "/user", controller = "addUser", action = "add", 
    conditions=dict(method=["GET"])) 
.... 
map.environ = {'REQUEST_METHOD':'DELETE'} 

Проблема заключается в том, что я должен добавить DELETE или PUT вручную который не идеален вообще, поскольку он не может быть динамическим.

EDIT:

Найден ответ!

request_method = environ.get('REQUEST_METHOD', '') 
map.environ = {'REQUEST_METHOD': request_method} 
Смежные вопросы