Как добавить новый параметр в Python API, созданный с помощью Flask - PullRequest
0 голосов
/ 08 января 2020

Я пишу свой Python API, используя Flask. Этот API принимает только 1 параметр с именем questionID. Я хотел бы принять второй параметр с именем lastDate. Я пытался посмотреть, как добавить этот параметр, но не смог найти хороший способ сделать это. Мой текущий код выглядит следующим образом:

from flask import Flask, request
from flask_restful import Resource, Api, reqparse
from sqlalchemy import create_engine
from json import dumps
from flask_jsonpify import jsonify
import psycopg2
from pandas import read_sql
connenction_string = "DB Credentials'";

app = Flask(__name__)
api = Api(app)

class GetUserAnswers(Resource):
    def get(self, questionID):
        conn = psycopg2.connect(connenction_string);
        cursor = conn.cursor();

        userAnswers = read_sql('''
        select * from <tablename> where questionid = ''' + "'" + questionID + "' order by timesansweredincorrectly desc limit 15" +'''
        ''', con=conn)

        conn.commit();
        conn.close();

        result = {}
        for index, row in userAnswers.iterrows():
            result[index] = dict(row)
        return jsonify(result)

api.add_resource(GetUserAnswers, '/GetUserAnswers/<questionID>')

if __name__ == '__main__':
     app.run(port='5002')

Вопрос 1: Я предполагаю, что могу принять второй параметр в определении get. Если это не так, как мне принять второй параметр?

Вопрос 2: Как мне изменить вызов api.add_resource() для принятия второго параметра?

Вопрос 3: В настоящее время я использую http://localhost:5002/GetUserAnswers/<some question ID> для вызова этого API из браузера. Как изменится этот вызов со вторым параметром?

Я никогда раньше не разрабатывал API, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Если вы хотите добавить несколько параметров в пути URL, например:

http://localhost:5002/GetUserAnswers/<question_id>/answers/<answer_id>

Затем вам нужно добавить несколько параметров в ваш метод get:

def get(self, question_id, answer_id):
    # your code here

Но если вместо этого вы хотите добавить в URL несколько параметров запроса, например: http://localhost:5002/GetUserAnswers/<question_id>?lastDate=2020-01-01&totalCount=10>

Тогда вы можете использовать аргументы запроса:

def get(self, question_id):
    lastDate = request.args.get('lastDate')
    totalCount = request.args.get('totalCount')
    # your code here
1 голос
/ 09 января 2020

Рассмотрим несколько изменений в вашем коде:

  1. Для более простой реализации используйте декораторы в Flask API и избегайте необходимости инициализировать и вызывать объект класса;
  2. Используйте параметризацию в SQL и избегайте потенциально опасной и грязной конкатенации строк;
  3. Избегайте использования библиотеки анализа тяжелых данных, pandas и ее неэффективной строки по строке iterrows l oop. Вместо этого обрабатывайте все с помощью объекта курсора, в частности используйте DictCursor в psycopg2;

Рефакторированный код Python (настройте предположение о том, как использовать lastDate):

#... leave out the heavy pandas ...

app = Flask(__name__)

@app.route('/GetUserAnswers', methods= ['GET'])
def GetUserAnswers():
    questionID = request.args.get('questionID', None)
    lastDate = request.args.get('lastDate', None)

    conn = psycopg2.connect(connenction_string)
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

    userAnswers = '''SELECT * FROM <tablename> 
                     WHERE questionid = %s
                       AND lastdate = %s
                     ORDER BY timesansweredincorrectly DESC
                     LIMIT 15
                 '''
    # EXECUTE SQL WITH PARAMS
    cur.execute(userAnswers, (questionID, lastDate))

    # SAVE TO LIST OF DICTIONARIES
    result = [dict(row) for row in cur.fetchall()]
    cur.close()
    conn.close()

    return jsonify(result)


if __name__ == '__main__':
     app.run(port='5002')

Вызов из браузера

http://localhost:5002/GetUserAnswers?questionID=8888&lastDate=2020-01-08
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...