Building flask -RESTful приложение - PullRequest
0 голосов
/ 07 марта 2020

Я начал работать над проектом, в котором я проектирую и кодирую какую-то социальную сеть. Я использовал keras для моего RS, флаттер для внешнего интерфейса и flask в качестве внутреннего. Я решил использовать flask -restful для упрощения процесса, но столкнулся с некоторыми трудностями. Я пытаюсь работать с ресурсами и классами, но я не могу избежать ощущения, что это выглядит ужасно. Я знаю, что, вероятно, делаю что-то неправильно (пока что много), но я не могу найти хороший пример того, как должен выглядеть flask -простой проект. Есть много ресурсов и классов, и код грязный. Я хотел бы получить некоторые рекомендации, я действительно не знаю, как заставить код выглядеть и вести себя лучше, и предотвратить вредные привычки.

Я знаю, что мне, очевидно, нужно разделить код на файлы, и в коде есть МНОГО вещей, которые можно было бы сделать лучше (с точки зрения комментариев, алгоритмов и т. Д. c), но помимо этого я ' Я не совсем уверен. Помощь будет оценена.

from flask import Flask,session #, jsonify, abort, make_response, , request
from flask_restful import Api, Resource, reqparse #, fields, marshal
from flaskext.mysql import MySQL
from werkzeug.security import safe_str_cmp#,check_password_hash
from flask_cors import CORS
from datetime import timedelta
#import pymysql

mysql = MySQL()
app = Flask(__name__, static_url_path="")
api = Api(app)
# MySQL configurations
app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = ""
app.config['MYSQL_DATABASE_DB'] = 'appdb'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
app.secret_key = "secret key"
app.config['PERMANENT_SESSION_LIFETIME'] =  timedelta(minutes=10)
CORS(app)
mysql.init_app(app)

"""
class HomeAPI(Resource):
    def __init__(self):
        super(HomeAPI,self).__init__()

    def get(self):
        if 'username' in session:
            username = session['username']
            return {'message': 'You are already logged in', 'username': username}
        else:
            return {'message': 'Home Page'}

class LoginAPI(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('username', type=str, required=True,
                                   help='No username provided',
                                   location='json')
        self.reqparse.add_argument('password', type=str, required=True,
                                   help='No password provided',
                                   location='json')

        super(LoginAPI, self).__init__()

    def post(self):
        args = self.reqparse.parse_args()
        conn = None
        cursor = None
        try:
            username = args['username']
            password = args['password']

            if username and password:
                conn = mysql.connect()
                cursor = conn.cursor()

                sql = "SELECT * FROM users WHERE username=%s"
                sql_where = (username,)
                cursor.execute(sql, sql_where)
                row = cursor.fetchone()

                if row:
                    if safe_str_cmp(row[2], password):
                        session['username'] = row[1]
                        print(session)
                        return {'message': 'You are logged in successfully'}

                    else:
                        return {'message': 'Bad Request - invalid password'}, 400

            else:
                return {'message': 'Bad Request - invalid credentials'}, 400

        except Exception as e:
            print("Exception caught: ",e)
        finally:
            if cursor and conn:
                cursor.close()
                conn.close()

class SignupAPI(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('username', type=str, required=True,
                                   help='No username provided',
                                   location='json')
        self.reqparse.add_argument('password', type=str, required=True,
                                   help='No password provided',
                                   location='json')
        super(SignupAPI, self).__init__()

    def post(self):
        args = self.reqparse.parse_args()
        conn = None
        cursor = None

        try:
            username = args['username']
            password = args['password']

            if username and password:
                conn = mysql.connect()
                cursor = conn.cursor()

                sql = "SELECT username FROM users"
                cursor.execute(sql)

                if self.user_exists(cursor):
                    return {'message': 'Bad Request - User already exist'} , 400

                else:
                    sql = "INSERT INTO user_groups(_user) VALUES(%s)"
                    cursor.execute(sql,(username,))
                    sql = "INSERT INTO users(username,password) VALUES(%s,%s)"
                    cursor.execute(sql,(username,password))
                    conn.commit()
                    return {'message': 'Signed up successfully'}

            else:
                return {'message': 'Bad Request - invalid credendtials'}, 400

        except Exception as e:
            print("Exception caught: ",e)
        finally:
            if cursor and conn:
                cursor.close()
                conn.close()

    def user_exists(self,cursor):
        for username in cursor:
            if self.reqparse.parse_args()["username"] == username[0]:
                return True
        return False

class LogoutAPI(Resource):
    def __init__(self):
        super(LogoutAPI, self).__init__()

    def get(self):
        if 'username' in session:
            session.pop('username', None)
        return HomeAPI.get(self)


class GroupsAPI(Resource):
    def get(self):
        if 'username' in session:
             conn = mysql.connect()
             cursor = conn.cursor()

             sql = "SELECT * FROM user_groups WHERE _user=%s"
             sql_where = (session['username'],)
             cursor.execute(sql, sql_where)
             row = cursor.fetchone()

             if row:
                 return {'message': row[1]}
             else:
                 return {'message': 'User has no groups'}
        else:
            return {'message': 'Unauthorized'}


class SearchAPI(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('group', type=str, required=True,
                                   help='No group provided',
                                   location='json')

        super(SearchAPI, self).__init__()

    def post(self):
        print(self.reqparse.args)

        if 'username' in session:
            args = self.reqparse.parse_args()
            group = args['group']

            conn = mysql.connect()
            cursor = conn.cursor()

            sql = "SELECT * FROM user_groups WHERE _groups=%s"
            sql_where = (group,)
            cursor.execute(sql, sql_where)
            row = cursor.fetchone()

            if row:
                return {'message': row[1]}
            else:
                return {'message': 'User has no groups'}

        else:
            return {'message': 'Unauthorized'}


api.add_resource(HomeAPI,'/',endpoint='home')
api.add_resource(LoginAPI,'/login', endpoint='login')
api.add_resource(LogoutAPI, '/logout', endpoint='logout')
api.add_resource(SignupAPI, '/signup', endpoint='signup')
api.add_resource(GroupsAPI,'/groups',endpoint="groups")
api.add_resource(SearchAPI,'/groups/search',endpoint="groups")
api.add_resource(ManageGroupAPI,'/groups/<int:group_id>',endpoint="groups")
api.add_resource(EnterGroupAPI,'/groups/<int:group_id>/join',endpoint="groups")
api.add_resource(LeaveGroupAPI,'/groups/<int:group_id>/leave',endpoint="groups")


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

Я не уверен, что правильный способ продемонстрировать, что я сделал, - поделиться таким большим количеством кода, поэтому исправьте мой, если я ошибаюсь. Я знаю, что токен сохранен на сервере и нарушает REST, позже я постараюсь найти решение.

Заранее спасибо!

...