发布时间:2019/02/09 22:43:30   更新时间:2020/07/31 19:51:52
from flask import Blueprint
from flask_restful import Api
api_bp = Blueprint("api", __name__, url_prefix="/api")
api = Api(api_bp)
#在后边import本文件的其他模块,因为这些模块还需要import蓝图。
#先定义蓝图,然后配置路由,是蓝图的使用方法。只不过这里分模块了。
import Route
import Errors
from flask import jsonify
from flask.views import MethodView
#这里用于跳转/api/error_404/的error,也就是url_for("api/error_404")
class Errors_404(MethodView):
def __init__(self):
self.response = jsonify({"error": "404", "message": "not found"})
self.response.status_code = 404
return
def get(self):
return self.response
def post(self):
return self.response
def put(self):
return self.response
def delete(self):
return self.response
from Resource import AuthResource
from Resource import UserAuthResource
from Resource import LoginResource
from Resource import LogoutResource
from Resource import PostResource
from Resource import UserPostResource
from Errors import Errors_404
#import 本文件夹的__init__.py里边的东西,用如下方法:
from . import api
'''
add_resource注册../api/xxx
'''
api.add_resource(AuthResource, "/auth/<string:if_str>/")
api.add_resource(UserAuthResource, "/user_auth/<string:if_str>/")
api.add_resource(LoginResource, "/login/")
api.add_resource(LogoutResource, "/logout/")
api.add_resource(Errors_404, "/error_404/", endpoint="error_404")
api.add_resource(PostResource, "/post/<string:if_str>/")
api.add_resource(UserPostResource, "/user_post/<string:if_str>/")
class LoginResource(Resource):
decorators = [Decorator.request_pretreat]
def __init__(self):
return
def get(self):
return set_return_data()
def post(self):
#前端校验。
#用户名只能用字母、数字、下划线,但不能是纯数字。
#email用@校验。
#tel暂时不考虑登录,只做信息补充完整。
user_name = request.form.get("username", -1)
pass_word = request.form.get("password", -1)
email = request.form.get("email", -1)
tel = request.form.get("tel", -1)
# .first()返回查询的第一个结果,如果没有结果,则返回 None
if -1!=user_name:
user = User.query.filter_by(username=user_name).first()
elif -1!=tel:
user = User.query.filter_by(tel=tel).first()
elif -1!=email:
user = User.query.filter_by(email=email).first()
else:
return set_return_data(-1, "no user or password error", "")
if ((None!=user) and (user.verify_password(pass_word))):
#login_user() 函数的参数是要登录的用户,以及可选的“记住我”布尔值,“记住我”如果值为 False,那么关闭浏览器后用户会话就过期了,所以下次用户访问时要重新登录。 如果值为 True,那么会在用户浏览器中写入一个长期有效的 cookie,使用这个 cookie 可以复现用户会话。
login_user(user, False)
#登录后返回next参数的页面,或者主页。
#return redirect(request.args.get("next") or url_for("page.main"))
return set_return_data(0, "login ok", user.username)
return set_return_data(-1, "no user or password error", "")
def put(self):
return set_return_data()
def delete(self):
return set_return_data()
class LogoutResource(Resource):
decorators = [login_required, Decorator.request_pretreat]
def __init__(self):
return
def get(self):
#注意,这里不能直接session = {},这样破坏了session的结构了。
logout_user()
return redirect(url_for("page.main"))
def post(self):
#注意,这里不能直接session = {},这样破坏了session的结构了。
logout_user()
return redirect(url_for("page.main"))
class UserAuthResource(Resource):
decorators = [login_required, Decorator.request_pretreat]
def __init__(self):
self.common_obj = Common()
return
def post(self, if_str):
try:
#修改密码
if if_str == "get_user_info":
return self.get_user_info()
#修改密码
elif if_str == "modify_password":
return self.modify_password()
#修改tel
#注意,这个流程上要走tel验证流程。
elif if_str == "modify_tel":
return self.modify_tel()
#修改email
elif if_str == "modify_email":
return self.modify_email()
else:
return redirect(url_for("api.error_404", next=request.url))
except Exception as err_instance:
return set_return_data(-1, "fail", traceback.format_exc())
本系列文章告一段落。本系列文章拷入了不少代码,通过添加大量代码注释的方式,讲解了一个相对完整的flask后端架构的基本功能。
文中代码在前边提示的版本环境上,都是调试通过的。
由于时间和水平有限,难免有很多值得商讨优化的地方。希望大家取其精华、弃其糟粕。
若有讨论,请通过本站联系方式联系。
如果您能赞助一二,请前往本站赞助栏,这将鼓励我们花时间和精力写出更多更好的文章来。非常感谢!