1

Python でのRESTful ルーティングが機能していないようです。例えば、

# 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 のいずれであるかは関係ありません。私のURLの一致のみを探します。 /user/{id}

したがって、DELETEメソッドを送信すると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"]))

私が間違ったことをしたアイデアはありますか?

編集

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された結果で常にこの警告が表示されます。

[Sat Aug 15 16:03:41.871541 2015] [wsgi:error] [pid 7068:tid 836] {'action': u'update', 'controller': u'updateUser', 'id': u'1' }

4

1 に答える 1

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 を追加する必要があることです。これは動的にできないため、まったく理想的ではありません

編集:

答えが見つかりました!

request_method = environ.get('REQUEST_METHOD', '')
map.environ = {'REQUEST_METHOD': request_method}
于 2015-08-15T09:04:07.860 に答える