多对多关联
class Student (db.Model) :
s_id = db.Column(db.Integer, primary_key=True , autoincrement=True )
s_name = db.Column(db.String(20 ), unique=True )
s_age = db.Column(db.Integer, default=18 )
s_g = db.Column(db.Integer, db.ForeignKey('grade.g_id' ), nullable=True )
__tablename__ = 'student'
def __init__ (self, name, age) :
self.s_name = name
self.s_age = age
sc = db.Table('sc' ,
db.Column('s_id' , db.Integer, db.ForeignKey('student.s_id' ), primary_key=True ),
db.Column('c_id' , db.Integer, db.ForeignKey('course.c_id' ), primary_key=True )
)
class Course (db.Model) :
c_id = db.Column(db.Integer, primary_key=True , autoincrement=True )
c_name = db.Column(db.String(10 ), unique=True )
students = db.relationship('Student' ,
secondary=sc,
backref='cou' )
__tablename__ = 'course'
def __init__ (self, name) :
self.c_name = name
@stu.route('/stucourse', methods=['GET', 'POST'])
def stu_cou () :
if request.method == 'GET' :
stus = Student.query.all()
cous = Course.query.all()
return render_template('stu_cou.html' , stus=stus, cous=cous)
else :
s_id = request.form.get('student' )
c_id_list = request.form.getlist('course' )
stu = Student.query.get(s_id)
cou_list = []
for c_id in c_id_list:
cou = Course.query.get(c_id)
cou.students.append(stu)
cou_list.append(cou)
db.session.add_all(cou_list)
db.session.commit()
return '提交成功'
@stu.route('/allstu')
def all_stu () :
stus = Student.query.all()
return render_template('all_stu.html' , stus=stus)
@stu.route('/selectcoursebystu/<int:id>/')
def select_course_by_stu (id) :
stu = Student.query.get(id)
cous = stu.cou
return render_template('stucourse.html' , cous=cous, stu=stu)
@stu.route('/deletecoursebyid/<int:s_id>/<int:c_id>/')
def delete_course_by_id (s_id, c_id) :
stu = Student.query.get(s_id)
cou = Course.query.get(c_id)
cou.students.remove(stu)
db.session.commit()
return redirect(url_for('stu.all_stu' ))
{% extends 'base_main.html' %}
{% block title %}
学生选课系统
{% endblock %}
{% block content %}
<form action ="" method ="post" >
<h3 > 学生信息:</h3 >
<select name ="student" >
<option > 请选择学生信息</option >
{% for stu in stus %}
<option value ="{{ stu.s_id }}" > {{ stu.s_name }}</option >
{% endfor %}
</select >
<h3 > 课程信息:</h3 >
<select name ="course" >
<option > 请选择课程信息</option >
{% for cou in cous %}
<option value ="{{ cou.c_id }}" > {{ cou.c_name }}</option >
{% endfor %}
</select >
<br >
<select name ="course" >
<option > 请选择课程信息</option >
{% for cou in cous %}
<option value ="{{ cou.c_id }}" > {{ cou.c_name }}</option >
{% endfor %}
</select >
<br >
<select name ="course" >
<option > 请选择课程信息</option >
{% for cou in cous %}
<option value ="{{ cou.c_id }}" > {{ cou.c_name }}</option >
{% endfor %}
</select >
<br >
<input type ="submit" value ="提交" >
</form >
{% endblock %}
重构项目
将公用的模块提取出来,建立单独的文件夹utils
init .pysettings.py App.py functions.py
import os
from utils.functions import get_db_uri
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
templates_dir = os.path.join(BASEDIR, 'templates' )
static_dir = os.path.join(BASEDIR, 'static' )
DATABASE = {
'USER' : 'root' ,
'PASSWORD' : '123456' ,
'HOST' : '127.0.0.1' ,
'PORT' : '3306' ,
'DB' : 'mysql' ,
'DRIVER' : 'pymysql' ,
'NAME' : 'flask3'
}
SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)
from flask import Flask
from Stu.views import stu
from Grade.views import grade
from utils.settings import templates_dir, static_dir, SQLALCHEMY_DATABASE_URI
from utils.functions import init_ext
def create_app () :
app = Flask(__name__, template_folder=templates_dir, static_folder=static_dir)
app.debug = True
app.register_blueprint(blueprint=stu, url_prefix='/stu' )
app.register_blueprint(blueprint=grade, url_prefix='/grade' )
app.config['SQLALCHEMY_DATABASE_URI' ] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
app.config['SECRET_KEY' ] = '<replace with a secret key>'
init_ext(app)
return app
from flask_sqlalchemy import SQLAlchemy
from flask_debugtoolbar import DebugToolbarExtension
from flask_restful import Api
from flask_marshmallow import Marshmallow
db = SQLAlchemy()
debugtoolbar = DebugToolbarExtension()
api = Api()
ma = Marshmallow()
def get_db_uri (DATABASE) :
user = DATABASE.get('USER' )
password = DATABASE.get('PASSWORD' )
host = DATABASE.get('HOST' )
port = DATABASE.get('PORT' )
name = DATABASE.get('NAME' )
db = DATABASE.get('DB' )
driver = DATABASE.get('DRIVER' )
return '{}+{}://{}:{}@{}:{}/{}' .format(db, driver, user, password, host, port, name)
def init_ext (app) :
db.init_app(app=app)
debugtoolbar.init_app(app=app)
api.init_app(app=app)
ma.init_app(app=app)
可以在网页上显示工具栏,对于调试代码非常有帮助,如下所示 pip install flask-debugtoolbar debugtoolbar官网
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY' ] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)
Restful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld (Resource) :
def get (self) :
return {'hello' : 'world' }
api.add_resource(HelloWorld, '/' )
if __name__ == '__main__' :
app.run(debug=True )
from utils.functions import ma
class StuMarsh (ma.Schema) :
class Meta :
fields = ('s_name' , 's_age' )
stumarsh = StuMarsh()
from flask_restful import Resource
from Stu.StuMarshmallow import stumarsh
class HelloStudent (Resource) :
def get (self, id) :
stu = Student.query.get(id)
return stumarsh.jsonify(stu)
api.add_resource(HelloStudent, '/api/stu/<int:id>/' )