第二章: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 = "123456@163.com"
            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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值