flask开发的一些经验(五)


类别:web开发   

发布时间:2019/02/09 22:43:30   更新时间:2020/07/31 19:51:52


app/api/__init__.py

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

app/api/Errors.py

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

app/api/Route.py

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>/")

app/api/Resource.py


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后端架构的基本功能。

        文中代码在前边提示的版本环境上,都是调试通过的。

        由于时间和水平有限,难免有很多值得商讨优化的地方。希望大家取其精华、弃其糟粕。

        若有讨论,请通过本站联系方式联系。

        如果您能赞助一二,请前往本站赞助栏,这将鼓励我们花时间和精力写出更多更好的文章来。非常感谢!


本文网址:https://www.pyfield.com/blog/?id=7