总述
2020年8月5日。是实训的第13天。
今天上午孟老师带我们学习了如何将flask工程化。其实是flask的django化。
flask作为一个轻量级的框架,把路由、数据库、项目启动全都放到了一起,虽然这样子一来开发的速度很快,但是内容一旦多起来,在一页代码中寻找会非常的麻烦。而且flask没有现成的数据库迁移工具。
所谓flask工程化,就是将app.py拆分开多个文件。
完成flask工程化后,flask稍微显得不那么轻量了(但是对比于django还是属于轻量水准的),但是工程化能使开发流程更加系统全面。
讲完flask的工程化后,时间还有剩余。孟老师向我们询问还有什么想知道的。我想起他之前说过django的session,便想让他在这时讲解一下。他很豪爽地讲解了。只用了短短10分钟。原来session这么简单啊。
flask工程化
文件配置
复制app.py的内容,然后粘贴到新建的app_config.py,略加修改,只应用在配置中使用到的包。
将app = Flask(__name__)修改为:
1 2 3 4 app = Flask(__name__, template_folder='templates' , static_folder="static" , )
同时新建两个文件夹:templates和static。
修改完的app_config.py全文如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from flask import Flaskfrom flask_cors import CORSimport osapp = Flask(__name__, template_folder='templates' , static_folder="static" , ) BASEDIR = os.path.abspath(os.path.dirname(__file__)) app.config['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///' +os.path.join(BASEDIR,'data.sqlite' ) ''' 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 ''' app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False CORS(app)
数据库迁移工具
先使用pip install flask-migrate和pip install flask-script安装两个包。
安装完毕后,新建一个database.py文件。编写如下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from app_config import appfrom models import dbfrom flask_migrate import Migrate,MigrateCommandfrom flask_script import Managermanager = Manager(app) migrate = Migrate(app,db) manager.add_command('db' ,MigrateCommand) if __name__ == '__main__' : manager.run()
接下来在命令行使用python database.py db init命令,就可以初始化数据库。
使用python database.py db migrate命令,就可以生成迁移文件。
使用python database.py db upgrade命令,就可以生成数据表。
模型
新建models.py文件。将app.py中关于models的复制到这里,也略加修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from app_config import appfrom flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app) class Info (db.Model ): __tablename__='info2' id = db.Column(db.Integer, primary_key=True ) title = db.Column(db.String(255 )) category = db.Column(db.String(60 )) def __repr__ (self ): return '<info.>%s ' % self.title
主程序
新建run.py文件。将app.py关于路由和运行的复制到这里,略加修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 from flask import Flask,jsonify,render_template,requestfrom app_config import appfrom models import Info,db@app.route('/' ,methods=['GET' ,'POST' ] ) def index (): info1 = Info(id =1 ,title='新闻1' ,category='娱乐新闻' ) info2 = Info(id =2 ,title='新闻2' ,category='工作新闻' ) db.session.add_all([info1,info2]) db.session.commit() return jsonify({'data' :{'name' :'Zorua' ,'age' :20 }}) @app.route('/query' ,methods=['GET' ,'POST' ] ) def query (): results=Info.query.all () for i in results: print (i) return jsonify({'data' :'Success' }) @app.route('/update' ,methods=['GET' ,'POST' ] ) def update (): Info.query.filter (Info.title=='新闻1' ).update({'category' :'改后新闻' }) db.session.commit() return jsonify({'data' :'Success' }) @app.route('/delete' ,methods=['GET' ,'POST' ] ) def delete (): Info.query.filter (Info.title=='新闻1' ).delete() db.session.commit() return jsonify({'data' :'Success' }) @app.route('/index' ,methods=['POST' ,'GET' ] ) def hello_world (): return render_template('index.html' ) @app.route('/api' ,methods=['POST' ,'GET' ] ) def api (): name = request.form.get('name' ) age = request.form.get('age' ) print (name) return jsonify({'data' :{'name' :name,'age' :age}}) if __name__ == '__main__' : app.run(debug=True ,host='0.0.0.0' ,port=8888 )
接下来运行项目只用在run.py中运行即可。
django的session
session就相当于是一个字典。
request.session['user_id'] = User.objects.get(username=username).id
就可以在session中新增user_id字段并记录下来。
session中的记录是有有效期的。