Swagger файл и Flask реализация в Python - PullRequest
0 голосов
/ 17 апреля 2020

Здравствуйте. Я реализую Flask API с аутентификацией, как я могу использовать apiKey для реализации там для использования в запросе, а также, если я хочу передать параметры записи, как мне это сделать?

Вот то, что я пробовал:

app = Flask(__name__)

pymysql_connect_kwargs = {'user': 'root',
                          'password': 'XXX',
                          'host': '10.10.10.XX',
                          'db' : 'bbhskl',
                          'charset': 'utf8mb4'}
app.config['pymysql_kwargs'] = pymysql_connect_kwargs
mysql = MySQL(app)

#api = Api(app, authorizations=authorizations)
limiter = Limiter(app, key_func=get_remote_address)
limiter.init_app(app)
api = swagger.docs(Api(app), apiVersion='0.1', api_spec_url='/doc', description = 'Order API')
Swagger(app)
auth = HTTPTokenAuth(scheme='Token')

tokens = {
    'awserftggyjkk34)ghtyrjrhhye34nnmw': 'cadmin',
    'bwsosjhee(dhj345gtyuioplsertbsjkl': 'dadmin',
    'mnchthas(sjklertyusvfgmbshdls234h': 'eadmin'

}
@auth.verify_token
def verify_token(token):
   if token in tokens:
       g.current_user = tokens[token]
       return True
   return False

class currentuser(Resource):

    decorators = [limiter.limit("5000/day")]
    @swagger.model
    @swagger.operation(notes='provide api key')
    @auth.login_required
    def get(self):
        return "Hello, %s!" % g.current_user


api.add_resource(currentuser, '/user')

class baseorder(Resource):

    decorators = [limiter.limit("133/day")]
    @swagger.model
    @swagger.operation(notes='provide apikey')
    @auth.login_required
    def get(self):
        sql = "select order_id, order_name from active_orders"
        cur = mysql.connection.cursor()
        cur.execute(sql)
        row_headers=[x[0] for x in cur.description]
        rows=cur.fetchall()
        json_data=[]
        for result in rows:
            json_data.append(dict(zip(row_headers,result)))
        return jsonify(json_data)

api.add_resource(baseorder, '/api/v1/data')

class order(Resource):

    decorators = [limiter.limit("5000/day")]
    @swagger.model
    @swagger.operation(notes='Pass the order id')
    @auth.login_required
    def post(self):
        return id


api.add_resource(order, '/api/v1/order<id>')

if __name__ == '__main__':
    app.run(debug=True)

Это работает и возвращает Swagger UI на localhost:5000/doc.html, но авторизация не работает и запрос на публикацию не работает. Кроме того, если я хочу обновить версию пользовательского интерфейса и изменить способ ее выполнения.

Любая помощь по этому вопросу была бы полезной.

...