2014-09-16 4 views
48

Это мой код:Как установить заголовки ответов в Flask?

@app.route('/hello', methods=["POST"]) 
def hello(): 
    resp = make_response() 
    resp.headers['Access-Control-Allow-Origin'] = '*' 
    return resp 

Однако, когда я делаю запрос от браузера на мой сервер я получаю эту ошибку:

XMLHttpRequest cannot load http://localhost:5000/hello. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 

Я также попробовал этот подход, устанавливая заголовки ответа «после» запроса:

@app.after_request 
def add_header(response): 
    response.headers['Access-Control-Allow-Origin'] = '*' 
    return response 

Нет кубиков. Я получаю ту же ошибку. Есть ли способ установить заголовки ответов в функции маршрута? Что-то вроде этого было бы идеальным:

@app.route('/hello', methods=["POST"]) 
    def hello(response): # is this a thing?? 
     response.headers['Access-Control-Allow-Origin'] = '*' 
     return response 

но я не могу найти все равно для этого. Пожалуйста помоги.

EDIT

если я локон URL с помощью запроса POST, как так:

curl -iX POST http://localhost:5000/hello 

Я получаю ответ:

HTTP/1.0 500 INTERNAL SERVER ERROR 
Content-Type: text/html 
Content-Length: 291 
Server: Werkzeug/0.9.6 Python/2.7.6 
Date: Tue, 16 Sep 2014 03:58:42 GMT 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>500 Internal Server Error</title> 
<h1>Internal Server Error</h1> 
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p> 

Любые идеи?

ответ

48

Вы можете сделать это довольно легко:

@app.route("/") 
def home(): 
    resp = flask.Response("Foo bar baz") 
    resp.headers['Access-Control-Allow-Origin'] = '*' 
    return resp 

Посмотрите на flask.Response и flask.make_response()

Но что-то подсказывает мне, что есть еще одна проблема, потому что after_request должны обрабатываться правильно тоже.

EDIT
Я просто заметил, что вы уже используете make_response, который является одним из способов сделать это. Как я уже говорил, after_request должен был работать. Попробуйте поразить конечную точку через завиток и посмотреть, что заголовки:

curl -i http://127.0.0.1:5000/your/endpoint 

Вы должны увидеть

> curl -i 'http://127.0.0.1:5000/' 
HTTP/1.0 200 OK 
Content-Type: text/html; charset=utf-8 
Content-Length: 11 
Access-Control-Allow-Origin: * 
Server: Werkzeug/0.8.3 Python/2.7.5 
Date: Tue, 16 Sep 2014 03:47:13 GMT 

отмечая заголовок Access-Control-Allow-Origin.

EDIT 2
Как я и подозревал, что вы получаете 500, так что вы не устанавливая заголовок, как вы думали. Попробуйте добавить app.debug = True, прежде чем запускать приложение и повторите попытку. Вы должны получить некоторый результат, показывая вам основную причину проблемы.

Например:

@app.route("/") 
def home(): 
    resp = flask.Response("Foo bar baz") 
    user.weapon = boomerang 
    resp.headers['Access-Control-Allow-Origin'] = '*' 
    return resp 

дает отформатированной страницу HTML ошибок, с этим в нижней части (полезно для локонов команды)

Traceback (most recent call last): 
... 
    File "/private/tmp/min.py", line 8, in home 
    user.weapon = boomerang 
NameError: global name 'boomerang' is not defined 
+0

Пожалуйста, смотрите изменения. Я получаю 500 ошибок. – dopatraman

2

Эта работа для меня

from flask import Flask 
from flask import Response 

app = Flask(__name__) 

@app.route("/") 
def home(): 
    resp = Response("") 
    resp.headers['Access-Control-Allow-Origin'] = '*' 
    return resp 

if __name__ == "__main__": 
    app.run() 
7

Использовать make_response Колбы примерно

@app.route("/") 
def home(): 
    resp = make_response("hello") #here you could use make_response(render_template(...)) too 
    resp.headers['Access-Control-Allow-Origin'] = '*' 
    return resp 

С flask docs,

flask.make_response(*args)

Sometimes it is necessary to set additional headers in a view. Because views do not have to return response objects but can return a value that is converted into a response object by Flask itself, it becomes tricky to add headers to it. This function can be called instead of using a return and you will get a response object which you can use to attach headers.

+1

Как насчет фрагмента кода для демонстрации? –

+0

Вы можете отправить запросы в args: http://flask.pocoo.org/docs/0.10/api/#flask.Flask.make_response – tokland

Смежные вопросы