

API的な事を実現したいのですが、PythonでDjangoなどの大掛かりなFrameworkを使用せずにURLDispatchを行うには、どのように実装すれば良いのでしょうか？


CC BY-SA 3.0
2015-02-08T12:53:45.137
6151
2016-02-14T16:20:47.693
8162
question
python
PythonでURLDispatchを行うには？


URLとビューのマッピングということであれば、
[WebDispatch](https://pypi.python.org/pypi/WebDispatch/) ではどうでしょう？


CC BY-SA 3.0
2015-02-08T13:47:59.033
6154
2015-02-08T13:47:59.033
806
6151
answer


ご自分で実装するとなると、PATH_INFO に入っている値と呼び出したい view をマッピングするようなもの作れば良いと思います。  
単純なのであれば↓のような感じでしょうか。  
<https://github.com/heavenshell/py-autodoc/blob/master/tests/app.py#L36>

ただこういうのを自分で作るのではなく、takayuki-shimizukawa さんが書かれているようなライブラリや、WebOB や Werkzeug
のようなものを使うのをお勧めします。  
<http://werkzeug.pocoo.org/docs/0.9/>


CC BY-SA 3.0
2015-02-08T16:11:14.383
6158
2015-02-08T16:11:14.383
2872
6151
answer


Pythonではウェブサーバがウェブアプリを呼び出すときのAPIが定義されています。この規格に従っていればApacheでもNginxでもおなじアプリを動かすことができます。これをWSGIと呼びます。WSGIのアプリとは次のようにenvironとstart_responseの二つの引数をとる関数です。

URL
Dispatchをやるためには`environ['PATH_INFO']`にpathが格納されているので、この文字列に従って場合分けをし、それぞれの文字列を返せば良いことになります。

[code]

    def hello_world_app(environ, start_response):
        status = '200 OK' # HTTP Status
        headers = [('Content-type', 'text/plain')] # HTTP Headers
    
        # ここでPATH_INFOに従って返答を作る
        path_info = environ['PATH_INFO']
        if path_info == '/':
           response = 'index!'
        elif path_info == '/secret':
           response = 'secret!'
        else:
            # 見つからない場合は404を返す
            start_response('404 not found', headers)
            return ['the page you looked for was not found']
    
        start_response(status, headers)
        return [response]
    
    if __name__ == '__main__':
        from wsgiref.simple_server import make_server
        httpd = make_server('', 8000, hello_world_app)
        print "Serving on port 8000..."
    
        # Serve until process is killed
        httpd.serve_forever()
    
[/code]

HTTPメソッドまで対応するなら@heavenshellさんの回答のリンクをみてください。


CC BY-SA 3.0
2016-02-14T16:20:47.693
22076
2016-02-14T16:20:47.693
7837
6151
answer