Vì vậy, tôi tin rằng câu trả lời hợp lệ cho điều này là: tiền tố phải được định cấu hình trong ứng dụng máy chủ thực tế mà bạn sử dụng khi quá trình phát triển hoàn tất. Apache, nginx, v.v.
Tuy nhiên, nếu bạn muốn điều này hoạt động trong quá trình phát triển khi chạy ứng dụng Flask trong gỡ lỗi, hãy xem ý chính này .
Bình thí nghiệm DispatcherMiddleware
đến để giải cứu!
Tôi sẽ sao chép mã ở đây cho hậu thế:
"Serve a Flask app on a sub-url during localhost development."
from flask import Flask
APPLICATION_ROOT = '/spam'
app = Flask(__name__)
app.config.from_object(__name__) # I think this adds APPLICATION_ROOT
# to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT
@app.route('/')
def index():
return 'Hello, world!'
if __name__ == '__main__':
# Relevant documents:
# http://werkzeug.pocoo.org/docs/middlewares/
# http://flask.pocoo.org/docs/patterns/appdispatch/
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
app.config['DEBUG'] = True
# Load a dummy app at the root URL to give 404 errors.
# Serve app at APPLICATION_ROOT for localhost development.
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app,
})
run_simple('localhost', 5000, application, use_reloader=True)
Bây giờ, khi chạy mã trên dưới dạng ứng dụng Flask độc lập, http://localhost:5000/spam/
sẽ hiển thịHello, world!
.
Trong một bình luận về một câu trả lời khác, tôi bày tỏ rằng tôi muốn làm điều gì đó như thế này:
from flask import Flask, Blueprint
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()
# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/
Áp dụng DispatcherMiddleware
cho ví dụ có sẵn của tôi:
from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)
# Now, this url works!
# http://host:8080/api/some_submodule/record/1/
flask.Flask#create_url_adapter
vàwerkzeug.routing.Map#bind_to_environ
có vẻ như nó sẽ hoạt động - bạn đã chạy mã như thế nào? (Ứng dụng thực sự cần được gắn trên đường dẫn phụ trong môi trường WSGIurl_for
để trả về giá trị mong đợi.)