python Django它提供了丰富的功能,可以帮助开发人员快速构建 Web 应用程序.比较适合复杂需要稳定的项目.
我是 移动端开发, 我只是想利用 python 开发一些接口提供给移动端进行使用. 单纯使用 flask 写接口是非常方便的. 但是 Django 有很多丰富的功能. 所以我就想结合使用二者. 使用当中遇到很多坑.以此做个记录.
比如我认为在 Django 中创建模型, 同时使用它的 ORM 对操作数据库非常方便. 但是我不喜欢 Django 对外提供接口的方式. 我创建了flask 文件. 并在里面调用了 Django 创建的模型. 报错一大堆.....
废话不多说,直接上重点. 要想在 flask 文件里面使用 Django 的模型.
//flaskApp.py
//设置
from flask_sqlalchemy import SQLAlchemy
from django.conf import settings
import pymysql
app = Flask(__name__)
//必须要配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'HeartChain.settings')
# 调用 Django 的 setup() 函数
apps.populate(settings.INSTALLED_APPS)
//导入模型的时候一定要在 os.environ.setdefault后面
from UserModel.models import User
from FlaskApp.userApi import userApi
app.register_blueprint(userApi, url_prefix="/api/user")
db = SQLAlchemy(app)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8001, debug=True)
from flask import Flask, render_template, Blueprint, request, jsonify
from django.db.models import Q
from Utils.UserTokenTool import create_token
userApi = Blueprint('userApi', __name__)
from UserModel.models import User
@userApi.route('/register', methods=['POST'])
def register():
# 模拟用户数据库
data = request.args
print(f'网络数据----{data}')
username = data.get('username')
password = data.get('password')
if username is None or password is None:
return jsonify({'error': 'Username and password are required.'}), 400
return create_user(username, password)
def create_user(username, password):
existing_user = check_user_exists(username)
if existing_user:
# 处理用户名已存在的情况
return jsonify({'message': f"用户名 '{username}' 已存在。"}), 202
else:
new_user = User()
new_user.username = username
new_user.password = password
new_user.token = create_token(username=username, userId=password)
print(f"token==={new_user.token}")
new_user.save()
return jsonify({'message': f"用户 '{username}' 创建成功。"}), 201
def check_user_exists(username):
print(f"check_user_exists--{username}")
# 使用 Q 对象构建查询条件,匹配用户名字段
query = Q(username=username)
# 使用 filter 方法查询匹配的用户
user = User.objects.filter(query).first()
print(f"check_user_exists--{user}")
# 如果用户存在,则返回 True,否则返回 False
return user is not None
让我们看一下整体的目录:
注意点: 要设置
class Meta 是 Django 模型的内部类,用于设置模型的元数据。在你提供的示例中,app_label 是用来指定模型所属的应用程序标签的属性。
在 Django 中,每个模型都属于一个应用程序,而 app_label 就是用来指定该模型所属应用程序的名称。通过设置 app_label,可以明确告诉 Django 模型属于哪个应用程序,而不是让 Django 自动推断。
在上述示例中,User 模型属于 UserModel 应用程序,通过设置 app_label,明确指定了它的所属应用程序。这对于大型项目中有多个应用程序的情况特别有用,因为它可以避免 Django 自动生成的应用程序名称可能导致的命名冲突。