Я начал работать над проектом, в котором я проектирую и кодирую какую-то социальную сеть. Я использовал 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, позже я постараюсь найти решение.
Заранее спасибо!