第二章:API中的用户注册

1.枚举类的编写

这里写图片描述


2.验证器的编写

from wtforms import Form
from wtforms import StringField, IntegerField
from wtforms.validators import DataRequired, Length, Email
from app.libs.enums import ClientTypeEnum


class ClientForm(Form):
    account = StringField(
        label='账号',
    )
    password = StringField(
        label='密码',
    )
    type = IntegerField(
        label='类型',
        validators=[
            DataRequired(message='类型不能为空')
        ]
    )

    def validate_type(self, field):
        type = field.data
        try:
            enum_type = ClientTypeEnum(type)  # enum_type是枚举类型
        except Exception as e:
            raise e
        self.type.data = enum_type # 把验证器中的type换成其所对应的枚举类型

3.控制器的编写(视图函数)

这里写图片描述


4.定制sqlalchemy

这里写图片描述


5.在models文件夹下实例化对象并创建基类和User类

这里写图片描述
这里写图片描述
这里写图片描述


6.在flask核心对象中注册sqlalchemy的对象

app/__init__.py

# -*- coding: utf-8 -*-
# @Author: Lai
from flask import Flask

def create_app():
    # 创建flask核心对象
    app = Flask(__name__)

    # 载入配置文件
    app.config.from_object('app.config')

    # 注册sqlalchemy的对象
    register_plugin(app)

    # 注册蓝图
    register_blue(app)

    return app

def register_plugin(app_obj):
    from app.models import db
    db.init_app(app_obj)
    with app_obj.app_context():
        db.create_all()

def register_blue(app_obj):
    from app.v1 import create_bluepint_v1
    app_obj.register_blueprint(create_bluepint_v1(), url_prefix='/v1')

配置文件app/config

# -*- coding: utf-8 -*-
# @Author: Lai

DEBUG=True

# 必填
SECRET_KEY = "f2f641ad648e4e5a81034a89a0ffbd80"

# sqlalchemy配置文件
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@localhost/api_test"
SQLALCHEMY_TRACK_MODIFICATIONS = True

添加测试数据app/test/test2.py

# -*- coding: utf-8 -*-
# @Author: Lai
import unittest
from manage import create_app
from app.models import db
from app.models.user import User

class BaseTest(unittest.TestCase):
    def setUp(self):
        app = create_app()
        self.c_app = app.app_context()
        self.c_app.push()

    def tearDown(self):
        self.c_app.pop()

    @unittest.skip
    def test_register(self):
        with db.auto_commit():
            user = User()
            user.email = "[email protected]"
            user.password = "123456"
            user.nickname = "jack"
            db.session.add(user)

7.完成注册的编写

app/models/user.py

# -*- coding: utf-8 -*-
# @Author: Lai

from . import db
from .base import Base
from werkzeug.security import generate_password_hash, check_password_hash

class User(Base):
    ...
    ...
    ...
    @staticmethod
    def register_by_email(nickname, account, password):
        with db.auto_commit():
            user = User()
            user.email = account
            user.password = password
            user.nickname = nickname
            db.session.add(user)

app/v1/client.py

# -*- coding: utf-8 -*-
# @Author: Lai
from app.libs.red_print import Red_Print
from app.models.user import User
from app.validators.forms import ClientForm, EmailClientForm
from app.libs.enums import ClientTypeEnum
from flask import request

api = Red_Print('client')

@api.route('/register', methods=['POST'])
def create_client():
    data = request.json
    form = ClientForm(data=data) # 接收json格式数据指定data=data
    if form.validate():
        promise = {
            ClientTypeEnum.USER_EMAIL: __register_user_by_email,
            ClientTypeEnum.USER_MOBILE: __register_user_by_mobile,
            ClientTypeEnum.USER_MINA: __register_user_by_mobile,
        }
        promise[form.type.data]()       # form.type.data 在验证器中已经换成了枚举类型
    return "success"   # 暂时

def __register_user_by_email():
    data = request.json
    form = EmailClientForm(data=data)
    if form.validate():
        User.register_by_email(form.nickname.data,
                               form.account.data,
                               form.password.data)

def __register_user_by_mobile():
    pass

def __register_user_by_mina():
    pass

猜你喜欢

转载自blog.csdn.net/lilied001/article/details/80783191
今日推荐