wsgi-----werkzeug web服务器与pythonweb通信标准 werkzeug.pocoo.org
jinja2----- jinjia.pocoo.org
数据库集成、表单认证、文件上传等,需要安装扩展
涉及的python包
0 Flask ( 1.0.2 )
主页: http://flask.pocoo.org/
、原码: http ://github .com/pallets/flask
文档: http ://flask.pocoo.org/docs/
0 pip ( 10.0.1)
主页: https: //github.com/pypa/pip
文档: https: //pip. pypa.io
0 Pipenv (v2018.05.18 )
主页: https://github.com/pypa/pipenv
文档: http: //pipenv.readthedocs.io/
0 Virtualenv ( 15.1.0 )
主页: https :// github.com/pypa/virtualenv
文档: https: //virtualenv.pypa.io
0 Pipfile ( 0.0.2 )
主页: https ://github.com/pypa/pipfile
0 python-dotenv ( 0.8.2)
主页: https: //github.com/theskumar/python-dotenv
0 Watchdog ( 0.8.3 )
主页: https ://github.com/gorakhargosh/watchdog
文档: https: //pythonhosted.org/watchdog/
环境准备
远程服务器搭建py虚拟环境
pip3 install pipenv #pipenv创建虚拟环境
pipenv --version #查看版本
cd flask1.0
git clone https://github.com/greyli/helloflask.git #flask项目
#创建虚拟环境
pipenv install #虚拟环境一般使用virtualenv来创建,pipenv集成了virtualenv,管理依赖包和虚拟环境更方便
#pipenv 会根据当前目录下pipfile文件中写的依赖包,创建一个文件夹,文件夹中是虚拟环境
注意记录创建虚拟环境的目录,可以将python解释器配置到pycharm中。
#/root/.local/share/virtualenvs/helloflask-iNS_Xsc0/bin/python3
#激活虚拟环境-显式执行
cd 项目地址
pipenv shell #会自动在项目目录的.env文件中加载环境变量
#激活虚拟环境-不显式执行
pipenv run python hello.py #以虚拟环境python解释器python文件。
#管理依赖
部署到远程服务器或者分享给别人,使用pip搭配requirements.txt文件来记录依赖
pipenv环境下,安装删除更新依赖包,pipfile以及pipfile.lock会自动更新
#查看当前环境依赖
pipenv graph #当前环境查看
pip list #查看依赖列表
#退出虚拟环境
deactivate
#删除虚拟环境
rmvirtualenv 虚拟环境名称
激活后命令行自带虚拟环境名称
安装flask
pipenv install flask #在virtual环境中,会自动安装jinja2,werkzeug等依赖包
pycharm远程开发环境配置
在win平台使用pycharm,操作虚拟机代码+运行虚拟机代码
https://www.cnblogs.com/wenqiangit/p/9771947.html
注意flask启动参数配置,配置之后就可以以配置的参数来启动app.py,
flask run --host=0.0.0.0 #--host=0.0.0.0监听所有网卡
flask run --host=0.0.0.0 --port=8000 #port监听为8000
#会自动找app.py或者application.py运行
直接运行的话,python app.py。不能启动flask
内网穿透工具:ngrok.com、localtunnel.github.io/www
./ngrok http 0.0.0.0:5000 #ngrok.com;内网穿透到ngrok
下图必须写workdir:是远程程序的执行目录
测试访问:关闭虚拟机防火墙,使用虚拟机ip,在宿主机浏览器直接访问虚拟机ip+5000端口
flask
路由
from flask import Flask #导入flask类
app = Flask(__name__) #__name__=当前文件名,实例化一个flask的app
#简单url
@app.route('/') #匹配路由,flask路由都是装饰器
def index(): #index视图函数
return '<h1>Hello, World!</h1>'
#添加多个视图,都返回一个视图函数
@app.route('/hi')
@app.route('/hello')
def say_hello():
return '<h1>Hello, Flask!</h1>'
#动态url
@app.route('/greet', defaults={'name': 'Programmer'}) #如果用户访问/greet,name变量使用默认值
@app.route('/greet/<name>') #访问/greet/foo、/greet/bar会触发
def greet(name):
return '<h1>Hello, %s!</h1>' % name #name变量可以被函数接收并使用
flask run----运行flask
flask run #启动,在虚拟环境启动
pipenv run flask run #启动开发服务器
环境变量
#自动发现程序实例
从当前目录中寻找app.py和wsgi.py模块,寻找app或application
从环境变量FLASK_APP对应值寻找app或application实例
主模块名称app.py,flask run命令会自动在其中寻找程序实例。如果主模块是其他名称,需要设置FLASK_APP。
export FLASK_APP=hello #如果主程序是hello,不是app,要记得改下模块
#管理环境变量
安装python-dotenv后,使用flask run会自动从.flaskenv文件和.env文件加载环境变量
#安装python-dotenv
pipenv install python-dotenv
注意:
.gitignore 文件使用忽略提交.env关键环境变量到仓库: https://github.com/github/gitignore/blob/master/Python.gitignore
忽略提交,pycharm生成的.idea目录
https://www.gitignore.io/api/pycharm
设置运行环境
flask支持区分开发和生产环境,开发环境具有在页面debug功能,重载功能
通过环境变量FLASK_ENV=development配置
- 调试器:查看错误代码的上下文信息
- 重载器:修改代码,立即作用到程序上,安装watchdog,效果更好
pipenv install watchdog --dev #--dev将包申明为开发依赖,在pipfile文件中,包会添加到dev-packages
项目中使用的css、javascript,浏览器会缓存,需要crtl+f5
python交互解释器
python shell
flask shell #需要进入python虚拟环境,开启虚拟环境,并在项目目录中执行,需要有.flask文件指定当前是生产还是开发
flask扩展
#注意扩展的书写格式
from flask import Flask
from flask_foo import Foo
app=Flask(__name__)
foo=Foo(app)
项目配置
# 加单个配置变量
app.config['ADMIN_NAME']='Peter' #配置变量必须大写
# 加多个配置变量
app.config.update(
TESTING=True,
SECRET_KEY='_sdjajadasda/'
)
# 读取配置变量
value=app.config['ADMIN_NAME']
url与端点
在html、js、css中生成url
@app.route('/')
def index():
return 'hello flask!'
url_for('index') #返回一个url=/,生成url绝对路径需要将第二个参数改为_external=True
#index为视图函数名称
@app.route('/hello/<name>')
def greet(name):
return 'hello %s!' % name
url_for('say_hello',name='jack') #生成url=/hello/jack
flask命令
flask run #运行flask服务器
flask shell #启动shell
创建自定义命令
@app.cli.command()
def hello():
click.echo('hello,human!')
调用:flask hello,会运行hello代码
@app.cli.command()
def hello('say-hello'):
click.echo('hello,human!')
调用:flask say-hello
flask --help 查看帮助
flask routes #显示所有注册路由
flask run #运行服务端
flask shell #运行shell在app上下文
模板与静态文件
template与static file目录结构
hello/
- templates/
- static/
app.py
HTTP
request对象
#请求地址http://192.168.188.128:5000/hello?name=Grey;返回hello,参数名字
from flask import Flask,request
app = Flask(__name__)
@app.route('/hello')
def hello():
name = request.args.get('name','Flask') #使用get方法获取请求参数,参数不在不报异常,返回none
return '<h1>hello,%s!<h1>' % name
colors = ['blue','white','red'] #('blue', 'white', 'red')
@app.route('colors/<any(%s):color>' % str(colors)[1:-1])
>>> print('colors/<any(%s):color>' % str(colors)[1:-1])
colors/<any('blue', 'white', 'red'):color> #匹配color参数值为其中一个