##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