大部分是照着这篇文章写的 https://cloud.tencent.com/developer/article/1585944
flask_register.py:
# coding:utf-8
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, jsonify, request
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from config import DB_URI
'''配置数据库'''
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
app.config['SECRET_KEY'] ='hard to guess'
# 这里登陆的是root用户,要填上自己的密码,MySQL的默认端口是3306,填上之前创建的数据库名jianshu,连接方式参考 \
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/flask_register'
#设置这一项是每次请求结束后都会自动提交数据库中的变动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True #这一句不加会报错
#实例化
db = SQLAlchemy(app)
engine = create_engine(DB_URI)
Base = declarative_base(engine) # SQLORM基类
session = sessionmaker(engine)() # 构建session对象
class User_Register(db.Model):
__tablename__ = 'register' # 表名
id = db.Column(Integer, primary_key=True, autoincrement=True) # 作为主key,且自增1
username = db.Column(String(20))
password = db.Column(String(20))
print(type(User_Register))
Base.metadata.create_all() # 将模型映射到数据库中
@app.route('/register',methods = ['post'])
def user_register():
username1 = request.values.get('username')
password1 = request.values.get('password')
if username1 and password1:
import re
if re.match("^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])).*$",username1) == None:
return jsonify({"code": 202, "msg": "用户名必须是大小写字母+数字,请检查!"})
elif re.match("^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])).*$",password1)==None:
return jsonify({"code": 203, "msg": "密码必须是大小写字母+数字,请检查!"})
else:
user_register = User_Register(username=username1, password=password1)
session.add(user_register)
session.commit()
#item_list = session.query(User_Register).filter(User_Register.username == username1).all()
# return str((item_list.name))
# for item in item_list:
# return jsonify({"username": item.username, "password": item.password})
return jsonify({"code": 0, "msg": "恭喜,注册成功!"})
else:
return jsonify({"code": 201, "msg": "用户名/密码,请检查!"})
if __name__ == '__main__':
app.run(port=8080, debug=True)
test_flask.py:(单独对register接口进行测试)
运行此代码前需要先运行flask_register.py并连接数据库
import unittest
from flask_register import app
import json
class Regiest_Test(unittest.TestCase):
'''定义测试用例'''
def setUp(self):
"""在执行具体的测试方法前,先被调用"""
self.app = app
# 激活测试标志
app.config['TESTING'] = True
# 在这里,使用flask提供的测试客户端进行测试
self.client = app.test_client()
def test_empty_name_pw(self):
'''用户名和密码有一项或亮相为空时'''
# 使用客户端向后端发送post请求, data指明发送的数据,会返回一个响应对象
response = self.client.post("/register", data={})
resp_json = response.data
# 按照json解析
resp_dict = json.loads(resp_json)
# 获取code的返回码的值,验证是否为状态码201
code = resp_dict.get("code")
self.assertEqual(code, 201) #201不可以加引号,会报错
response = self.client.post("/register", data={'username':'099IKKd'})
resp_json = response.data
# 按照json解析
resp_dict = json.loads(resp_json)
# 获取code的返回码的值,验证是否为状态码201
code = resp_dict.get("code")
self.assertEqual(code, 201)
'''输入不符合规范的用户名时'''
def test_wrong_name_pw(self):
response = self.client.post("/register", data={'username':'33o2234',"password":'234JNdd'})
resp_json = response.data
# 按照json解析
resp_dict = json.loads(resp_json)
# 获取code的返回码的值,验证是否为状态码
code = resp_dict.get("code")
self.assertEqual(code,202)
msg=resp_dict.get('msg')
self.assertEqual(msg,'用户名必须是大小写字母+数字,请检查!')
'''用户名合法,密码不合法时'''
response = self.client.post("/register", data={'username':'33oD2234',"password":'Ndd'})
resp_json = response.data
# 按照json解析
resp_dict = json.loads(resp_json)
# 获取code的返回码的值,验证是否为状态码
code = resp_dict.get("code")
self.assertEqual(code,203)
msg=resp_dict.get('msg')
self.assertEqual(msg,'密码必须是大小写字母+数字,请检查!')
'''用户名和密码均正确时'''
def test_right_name_pw(self):
response = self.client.post("/register", data={'username': '33o22F34', "password": '234JNdd'})
resp_json = response.data
# 按照json解析
resp_dict = json.loads(resp_json)
# 获取code的返回码的值,验证是否为状态码
code = resp_dict.get("code")
self.assertEqual(code, 0)
msg = resp_dict.get('msg')
self.assertEqual(msg, '恭喜,注册成功!')
if __name__ == '__main__':
unittest.main()
执行结果: