文 / 秦未
众所周知,Flask是自由的,它极易扩展,拥有非常多的第三方扩展包,这些第三方扩展包主要特点就是简单,即学即用,这也是我们学习Flask的主要原因之一。
当我们想要实现某项功能之前,网上很有可能已经有别人写好的插件了,我们不需要重复造轮子,而更应该将时间花费在我们想要实现的功能上。
那么这些第三方扩展包我们从哪里获取呢?
1.官方获取扩展包
地址:http://flask.pocoo.org/extensions/
在这个网页我们能获取官方团队验证的第三方扩展包,并且也提供详细的文档供我们查询。
2.Pycharm获取扩展包
我们也可以通过Pycharm获取扩展包,按照下图所示步骤去做,我们就可以下载安装扩展包。
3.备份与恢复环境
我们如果安装了这些扩展包,那么我们如何在不同系统,不同环境中同样也拥有相同版本的第三方扩展包(库)呢?
这里我们就利用一个pip的命令就可以了:
pip freeze > requirements.txt
恢复:
pip install -r requirements.txt
4.使用类似Django的manage管理工具
好的,现在我们需要一个管理工具,管理我们的项目:
pip install flask-script
当然在Pycharm中安装也是很方便的。
接下来使用它,我们在app.py中导入它:
from flask_script import Manager
# 这里app已经实例化了
manager = Manager(app)
然后项目启动那里改成:
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
为避免不清楚具体情况,我将所有代码贴出:
# /app/app.py
# -*- coding:utf-8 -*-
import datetime
from flask import Flask, render_template, request, redirect, url_for, make_response
from os import path
from flask_script import Manager
from werkzeug.routing import BaseConverter
from werkzeug.utils import secure_filename
class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter, self).__init__(url_map)
self.regex = items[0]
app = Flask(__name__)
app.url_map.converters['regex'] = RegexConverter
manager = Manager(app)
@app.route('/')
def index():
# 获取cookies
# username = request.cookies.get('username')
# 封装render_template
response = make_response(render_template('blog/index.html', **{
'text': 'Hello, World',
}))
# 设置cookies--参数1:名称,参数2:值,expires指定过期时间;(记得导入datetime模块!)
outdate = datetime.datetime.today() + datetime.timedelta(days=30)
response.set_cookie('username', 'admin', expires=outdate)
return response
@app.route('/about')
def about():
return '<h1>about</h1>'
@app.route('/user/<username>')
def user(username):
return F'<h1>{username}</h1>'
@app.route('/login/', methods=['GET', 'POST'])
def login():
# 判断请求方式
if request.method == 'POST':
# POST方式时数据是在form里面
username = request.form.get('username')
password = request.form.get('password')
# 获取文件
my_file = request.files.get('file')
# 获取当前路径
basepath = path.abspath(path.dirname(__file__))
# 将路径连接
upload_path = path.join(basepath, 'static/uploads/')
# 保存文件并将文件名获取封装
my_file.save(upload_path + secure_filename(my_file.filename))
# 跳转upload函数
return redirect(url_for('upload'))
else:
# GET方式时数据是在args里面
username = request.args.get('username')
password = request.args.get('password')
return render_template('blog/login.html', method='GET')
@app.route('/upload')
def upload():
return '<h1>上传成功!</h1>'
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
终端中运行:
python app.py runserver
也可以在Pycharm中配置一下启动命令:
在 run 选项的下拉箭头,选择 edit configure 选项,然后在 script parameters 里添加 runserver 即可。
地址还是一样的:http://127.0.0.1:5000
有时候我们还会遇到一个问题,就是如果我们修改一下代码就要手动重启一次服务,那简直太浪费我们的时间了,有这样一个库可以解决我们的问题,它叫livereload(可理解为即时刷新),还是一样的先安装它:
pip install livereload
使用它的方法其实也很简单,我们先在app.py中建立一个函数:
@manager.command
def dev():
# 导入包
from livereload import Server
# 封装
live_server = Server(app.wsgi_app)
# 设置监测文件路径
live_server.watch('**/*.*')
# 同时让它刷新
live_server.serve(open_url=True)
启动它,终端输入:
python app.py dev
这样它就会默认监测项目文件变动,并即时刷新。
---end---