【问题标题】:Running Quart in production behind Hypercorn在 Hypercorn 后面运行 Quart
【发布时间】:2021-06-09 16:03:28
【问题描述】:

大家好,我正在尝试在生产环境中运行 Quart。

这是我的代码: setups.py

import quart.flask_patch
from db import *

from http import HTTPStatus
from typing import Optional


import flask.json
from quart import ResponseReturnValue, jsonify, Quart
from quart.ctx import RequestContext
from quart.exceptions import HTTPException
from quart_openapi import Pint

from .confs import __author__, __description__, __mail__, __title__, __version__,SQLALCHEMY_DATABASE_URI
from .routes import initialize_routes
from .user_verify import get_jwks, verify_jwt
        

class PintCustom(Pint):
    def __init__(self, *args, no_openapi: bool = False, **kwargs) -> None:
        self.jwks = get_jwks()
        super().__init__(*args, no_openapi=no_openapi, **kwargs)

    async def preprocess_request(self, request_context: Optional[RequestContext] = None) -> Optional[
        ResponseReturnValue]:
        token = request_context.request.headers.get('Authorization')
        if request_context.request.method != 'OPTIONS':
            try:
                verify_jwt(str(token), self.jwks)
            except Exception:
                raise HTTPException(HTTPStatus.UNAUTHORIZED, 403, 'Log in')

        return await super().preprocess_request(request_context)


def get_app_instance():
    # Initial app.
    # app = Quart(__name__)
    app = PintCustom(__name__, title=__title__, version=__version__, description=__description__,
                     contact_email=__mail__, contact=__author__)


    @app.errorhandler(HTTPException)
    def http_exception(e):
        return jsonify(error=e.name, error_details=e.description), e.status_code

    app.jwks = get_jwks()

    # Initial all the REST API routes.
    initialize_routes(app)


    # DB
    app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI
    db.init_app(app)

    return app

server.py

__package__ = 'nini'

from .setups import create_app
from .db import db

if __name__ == '__main__':
    app = create_app()
    db.init_app(app)

    app.run(host='127.0.0.1', debug=True)

当我运行 hypercorn server:app 我明白了:

ModuleNotFoundError: 没有名为“nini”的模块

我在 ../nini/server.py 下运行命令

我没有看到很多关于这方面的教程。 也尝试运行:

pipenv 安装夸脱
pipenv 外壳
导出 QUART_APP=server:app
夸脱跑

同样的错误

【问题讨论】:

    标签: quart hypercorn


    【解决方案1】:

    server 模块上的 app 实例仅在您将该模块作为主模块调用时才存在,而 Hypercorn 不会这样做。相反,您可以调用工厂函数hypercorn "server:create_app()"

    您可能希望将db.init_app(app) 行移至create_app 函数(我认为您已将其称为get_app_instance?)内,因为它也仅在您将服务器作为主模块调用时才被调用。

    我认为您不需要__package__ = 'nini',这也可能会导致问题。

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2020-07-02
      • 2020-09-26
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多