Flask+SQlAchemy解决循环引用

在Flask中使用Flask sqlalchemy时出现的循环引用

将数据库的model单独写在一个文件中,Model类需要继承db.Model,而主文件中需要注册数据库,这样会导致在主文件中引用model,在model中引用主文件的db,造成循环引用。

解决办法是把db单独写在一个文件中,然后主文件引用db并注册,model也引用db

目录结构为:

数据库文件写在database目录下的exts.py中

exts.py文件:

 
from flask_sqlalchemy import SQLAlchemy
#此时先不传入app
db = SQLAlchemy()
数据库的配置文件写在config.py文件中:
DIALECT='mysql'
DRIVER='mysqldb'
USERNAME='数据库用户名'
PASSWORD='数据库密码'
HOST='数据库主机地址'
PORT='数据库端口号'
DATABASE='数据库名称'
SQLALCHEMY_DATABASE_URI=DIALECT+'://'+USERNAME+':'+PASSWORD+'@'+HOST+':'+PORT+'/'+DATABASE
SQLALCHEMY_TRACK_MODIFICATIONS=False
使用 migrate管理数据库版本迁移:
manager.py文件:
 
# coding:utf-8
from flask_script import Manager
from Chat import app,db
from flask_migrate import Migrate,MigrateCommand
from model.models import User,Message
manager=Manager(app)
migrate=Migrate(app,db)
manager.add_command('db',MigrateCommand)
if __name__=='__main__':
    manager.run()
在主文件中导入相关文件,并初始化db:
 
from flask import Flask,request,render_template,jsonify
import config
from model.models import User
from database.exts import db
app = Flask(__name__)
app.config.from_object(config)
CORS(app, supports_credentials=True)
app.debug = True
db.init_app(app)
model文件:
 
# -*- coding: UTF-8 -*-
from database.exts import db
class User(db.Model):
    __tablename__='user'
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    name=db.Column(db.String(40),unique=True,nullable=False)
    password=db.Column(db.String(32),nullable=False)
    email=db.Column(db.String(40),nullable=False)
    create_time=db.Column(db.String(20),nullable=False)
    update_time=db.Column(db.String(20),nullable=False)
    def __init__(self,name,password,email,create_time,update_time):
        self.name=name
        self.password=password
        self.email=email
        self.create_time=create_time
        self.update_time=update_time
    def __repr__(self):
        return '<User {}>'.format(self.name)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Flask和JavaScript解决"Content-Security-Policy"头缺失问题的方法如下: 1. 在Flask应用程序设置"Content-Security-Policy"头。可以通过在应用程序的路由函数使用`@app.after_request`装饰器来设置响应头。示例代码如下: ```python from flask import Flask, make_response app = Flask(__name__) @app.after_request def add_csp_header(response): response.headers['Content-Security-Policy'] = "default-src 'self'" return response ``` 上述代码将在每个响应添加"Content-Security-Policy"头,并将其值设置为"default-src 'self'",表示只允许加载来自同一域名的资源。 2. 在JavaScript处理跨域请求。如果你的JavaScript代码需要从不同的域名加载资源,可能会遇到"Access-Control-Allow-Origin"错误。为了解决这个问题,可以在服务器端设置响应头,允许来自其他域名的请求。示例代码如下: ```python from flask import Flask, make_response app = Flask(__name__) @app.after_request def add_cors_header(response): response.headers['Access-Control-Allow-Origin'] = '*' return response ``` 上述代码将在每个响应添加"Access-Control-Allow-Origin"头,并将其值设置为"*",表示允许来自任何域名的请求。 3. 在前端页面入JavaScript文件。在HTML文件使用`<script>`标签入JavaScript文件,并确保该文件位于与HTML文件相同的域名下。示例代码如下: ```html <!DOCTYPE html> <html> <head> <title>Flask + JavaScript</title> <script src="static/js/script.js"></script> </head> <body> <!-- 页面内容 --> </body> </html> ``` 上述代码将在页面入名为"script.js"的JavaScript文件,该文件位于"static/js/"目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值