簡體   English   中英

如何使用 Flask 中的 register_blueprint?

[英]How do I work with register_blueprint in Flask?

我有以下app.py:

from flask import Flask
from waitress import serve
from bprint import api_blueprint
from errors import invalid_id, not_found, invalid_input, internal_server_error, unauthorized_access

app = Flask(__name__)

app.register_blueprint(api_blueprint)

app.register_error_handler(400, invalid_id)
app.register_error_handler(401, unauthorized_access)
app.register_error_handler(404, not_found)
app.register_error_handler(405, invalid_input)
app.register_error_handler(500, internal_server_error)

if __name__ == "__main__":
    serve(app, host='localhost')

以及 bprint.py 中的以下代碼:

from flask import Blueprint, jsonify, request
import dbu
from models import Session, user_table, car_table, order_table
from schema import UserDetails, UserQuery, OrderDetails, OrderQuery, CarDetails, CarQuery, LoginData, \
    ListUsersReq, Response
from contextlib import contextmanager
from flask_jwt_extended import jwt_required, create_access_token, get_jwt_identity
import datetime

api_blueprint = Blueprint('api', __name__)


@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    else:
        try:
            session.commit()
        except:
            session.rollback()
            raise


@api_blueprint.route("/login", methods=["POST"])
def login():
    from app import bcrypt
    data = LoginData().load(request.json)
    if data:
        user = dbu.get_entry_by_username(user_table, username=data["username"])
        hpw = bcrypt.generate_password_hash(data["password"])
        if not user:
            return jsonify({"message": "Couldn't find user!"})
        if bcrypt.check_password_hash(hpw, data["password"]):
            access_token = create_access_token(identity=data["username"], expires_delta=datetime.timedelta(days=365))
            return jsonify(access_token=access_token, id=user.id), 200


@api_blueprint.route("/user", methods=["GET"])
def list_users():
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            args = ListUsersReq().load(request.args)
            userlist = dbu.list_users(args.get("email"), args.get("username"))
            return jsonify(UserDetails(many=True).dump(userlist))
        else:
            return jsonify(code=401, type='UNAUTHORIZED_ACCESS'), 401


@api_blueprint.route("/user", methods=["POST"])
def create_user():
    with session_scope():
        from app import bcrypt
        user_details = UserQuery().load(request.get_json(force=True))
        user_details["password"] = bcrypt.generate_password_hash(user_details["password"]).decode('UTF-8')
        user = dbu.create_entry(user_table, **user_details)
        access_token = create_access_token(identity=user.username, expires_delta=datetime.timedelta(days=365))
        return jsonify(access_token=access_token, id=UserDetails().dump(user)["id"]), 200


@api_blueprint.route("/user/<int:id>", methods=["GET"])
def user_by_id(id):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            user = dbu.get_entry_by_id(user_table, id)
            return jsonify(UserDetails().dump(user))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/user/<int:id>", methods=["PUT"])
def update_user(id):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin or user.id == id:
            user_details = UserQuery().load(request.json)
            user = dbu.get_entry_by_id(user_table, id)
            dbu.update_entry(user, **user_details)
            return jsonify(Response().dump({"code": "200"}))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/user/<int:id>", methods=["DELETE"])
def delete_user(id):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin or user.id == id:
            dbu.delete_entry(user_table, id)
            return jsonify(Response().dump({"code": "200"}))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars", methods=["GET"])
def get_inventory():
    with session_scope():
        cars = dbu.list_cars()
        return jsonify(CarDetails(many=True).dump(cars))


@api_blueprint.route("/cars/car/<int:carId>", methods=["GET"])
def get_car_by_id(carId):
    with session_scope():
        car = dbu.get_car_by_id(car_table, carId)
        return jsonify(CarDetails().dump(car))


@api_blueprint.route("/cars/car", methods=["POST"])
def create_car():
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            car_details = CarQuery().load(request.json)
            car = dbu.create_entry(car_table, **car_details)
            return jsonify({"carId": CarDetails().dump(car)["carId"]})
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars/car/<int:carId>", methods=["PUT"])
def update_car(carId):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            car_details = CarQuery().load(request.json)
            car = dbu.get_car_by_id(car_table, carId)
            dbu.update_entry(car, **car_details)
            return jsonify(Response().dump({"code": "200"}))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars/car/<int:carId>", methods=["DELETE"])
def delete_car(carId):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            dbu.delete_car(car_table, carId)
            return jsonify(Response().dump({"code": "200"}))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars/car/<int:carId>/order", methods=["POST"])
def place_order(carId):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user:
            order_data = OrderQuery().load(request.json)
            order = dbu.create_entry(order_table,
                                     userId=user.id,
                                     carId=carId,
                                     shipDate=order_data["shipDate"],
                                     returnDate=order_data["returnDate"],
                                     status="placed",
                                     complete=False)
            return jsonify({"id": OrderDetails().dump(order)["id"]})
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/orders", methods=["GET"])
def get_orders():
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user.admin:
            orders = dbu.list_orders()
            return jsonify(OrderDetails(many=True).dump(orders))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars/car/<int:carId>/order/<int:orderId>", methods=["GET"])
def get_order_by_id(carId, orderId):
    with session_scope():
        current_user = get_jwt_identity()
        user = dbu.get_entry_by_username(user_table, current_user)
        if user:
            order = dbu.get_entry_by_id(order_table, id=orderId)
            return jsonify(OrderDetails().dump(order))
        else:
            return jsonify(code=401, type="UNAUTHORIZED_ACCESS"), 401


@api_blueprint.route("/cars/car/<int:carId>/order/<int:orderId>", methods=["DELETE"])
def delete_order(carId, orderId):
    with session_scope():
        dbu.delete_entry(order_table, id=orderId)
        return jsonify(Response().dump({"code": "200"}))

當我嘗試運行waitress-serve --port=5000 app:app時,出現以下錯誤:

    app.register_blueprint(api_blueprint)
    raise AssertionError(
AssertionError: View function mapping is overwriting an existing endpoint function: api.wrapper

可能是什么問題? 我幾乎可以肯定它在 12 月有效,現在在重新安裝我的 Windows 后它沒有現在它還說我的問題中有太多代碼,我不知道如何用更多的詞來解釋我的問題,所以我必須添加幾行無用的行,sorry

檢查視圖上是否有一些自定義裝飾器。 因為 flask 從@route參數或 function 名稱中獲取端點名稱。 在您的情況下,任何函數中都沒有endpoint參數。 錯誤說api.wrapper ,這意味着您有 2 個或更多 function 名稱為wrapper 通常我們在裝飾器中看到這樣的名字。 所以你可能有看起來像的裝飾器

def decorator(f):
    def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapper

並且有些視圖是用這樣的裝飾器裝飾的。 而 flask 以“wrapper”為視圖名

嘗試注釋幾行代碼 - 它可能會幫助您解決問題。

from flask import Flask
from waitress import serve
from bprint import api_blueprint
# from errors import invalid_id, not_found, invalid_input, internal_server_error, unauthorized_access

app = Flask(__name__)

app.register_blueprint(api_blueprint)

# app.register_error_handler(400, invalid_id)
# app.register_error_handler(401, unauthorized_access)
# app.register_error_handler(404, not_found)
# app.register_error_handler(405, invalid_input)
# app.register_error_handler(500, internal_server_error)

if __name__ == "__main__":
    serve(app, host='localhost')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM