37040


Go言語のこのコードと同じことをPythonで書きたいです  
PythonだとURLしか渡せないのでしょうか？  
分かる方、どのように書けばいいのか教えてください！

[code]

    http.Redirect(w, r, "/todos", 303)
    
[/code]


CC BY-SA 3.0
2017-08-08T09:40:44.203
37015
2017-08-09T07:06:04.817
2017-08-08T23:44:49.913
19110
24104
question
python go http python3
PythonのHTTP通信リダイレクトについて


flaskなら `redirect('/todos', code=303)`でいいと思いますよ。

[code]

    from flask import Flask, make_response, redirect, url_for
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        return redirect('/foo', code=303)
    
    
    @app.route('/foo')
    def foo():
        response = make_response('redirected')
        response.headers['content-type'] = 'text/plain'
        return response
    
    if __name__ == '__main__':
        app.run(port=8080)
    
[/code]

これを動かして`http://localhost:8080/`にアクセスするとリダイレクトされます。

あるいは`redirect(url_for('foo'),
code=303)`もありです。この例だと`foo`関数がコールされるようなurlを組み立てろ、という指示になります。

* * *

というか、GoLangの `http.Redirect(w, r, "/todos", 303)`だって、ここで指定している
`"/todos"`はURLだと思うんですが。

* * *

> HTTPのボディ部分やヘッダー部分に‌​なにかを埋め込んだり、そういったカスタマ‌​イズは難しいでしょうか

できますが難しいです。難しいというのは「コードの動きを理解したりするのが難しい」ということです。

<http://flask.pocoo.org/docs/0.12/api/#flask.redirect>  
関数の`Redirect=`引数にカスタムのReponseクラスを指定できます。指定しない時にどうなるかは書いてあるとおりですが、そのクラスを使って  
<https://github.com/pallets/werkzeug/blob/master/werkzeug/utils.py#L373>  
というようにインスタンス化されています。このデフォルトのコンテンツを無視するようにすればいいです。

が。ちょっと調べても推奨のやり方みたいなものは見つかりませんでした。

ひとまず

[code]

    from flask import Flask, Response, make_response, redirect
    
    app = Flask(__name__)
    
    
    class CustomRedirectResponse(Response):
        def __init__(self, response=None, status=None, headers=None, mimetype=None, content_type=None,
                     direct_passthrough=False):
            # 引数として与えられてくるresponseを無視して自分が出したいコンテンツを
            # 親クラスの初期化子の第1引数にセットしてしまう（他の引数はそのまま委譲）
            super().__init__('Custom Response...', status, headers, mimetype, content_type, direct_passthrough)
    
            # 独自ヘッダを追加したり
            self.headers['custom-header'] = 'customized'
    
    
    @app.route('/')
    def index():
        return redirect('/foo', code=303, Response=CustomRedirectResponse)
    
    
    @app.route('/foo')
    def foo():
        response = make_response('redirected')
        response.headers['content-type'] = 'text/plain'
    
        return response
    
    
    if __name__ == '__main__':
        app.run(port=8080)
    
[/code]

みたいに書けばレスポンスをすげ替えられることは確認できました。


CC BY-SA 3.0
2017-08-09T03:05:30.270
37040
2017-08-09T07:06:04.817
2017-08-09T07:06:04.817
12274
12274
37015
answer