В чем разница между request.path и request.url_rule? - PullRequest
0 голосов
/ 09 марта 2020

Я хотел бы выполнить некоторый код перед каждым запросом для некоторого URL. Итак, как лучше всего проверить путь из запроса? Он отлично работает в разработке, но когда он развернут на производстве, я получаю request.url_rule = None для http://host:port/swagger, поэтому моя третья часть elif str(request.url_rule) == '/swagger' не выполняется. Если я изменится на request.path, то это работает. Не знаете, какой из них лучше использовать, можете ли вы подсказать, в чем здесь разница?

from flask import Flask, request, jsonify, make_response
from flask_restful import Api
from flask_swagger_ui import get_swaggerui_blueprint

app = Flask(__name__, static_folder='swagger')

if app.config["ENV"] == "production":
    app.config.from_object("config.ProductionConfig")
else:
    app.config.from_object("config.DevelopmentConfig")

# swagger specific
swagger_url = '/swagger'
static_url = '/static/api.yaml'
SWAGGERUI_BLUEPRINT = get_swaggerui_blueprint(
    swagger_url,
    static_url,
    config={
        'app_name': "Test"
    }
)
app.register_blueprint(SWAGGERUI_BLUEPRINT, url_prefix=swagger_url)
# end swagger specific

db = SQLAlchemy(app)
jwt = JWTManager(app)
api = Api(app, prefix='/api')

# middleware
@app.before_request
def before_request_callback():
    """
        This is callback will run before each and every endpoint .
    :return:
    """
    # Checking jwt-authentication for every request except login
    if str(request.url_rule) == '/api/v1/login':
        # do execute some code 
    elif str(request.url_rule) != '/api/v1/user/create' and \
          # do execute some code 
    elif str(request.url_rule) == '/swagger':
        # problem is here
...