最近想学flask,于是作一些小记
- 拉取镜像docker pull python
- 启动容器docker run -it --name python -d -v /data/python:/data/python -p 9999:9999 python bash
,端口为在这里自己定的
- 进入容器docker exec -it python bash
- 检查python版本python -V
,检查pip版本pip -V
- 在宿主机器的/data/python目录建flask目录,创建test1.py文件,代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
如果你使用单一的模块(如本例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main’ 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等
。在容器内运行程序python test1.py
会打开http://127.0.0.1:5000/的请求,很明显这只是允许本容器访问。
- 修改程序为开发调式模式,并允许外部访问,使用我们启动容器使用的映射端口
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9999)
运行程序
* Serving Flask app "test2" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:9999/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 277-338-011
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/hello')
def hello():
return 'good boy'
@app.route('/project/')
def project():
return 'my project'
@app.route('/about')
def about():
return 'about something'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9999)
@app.route
为路由定义,使用在定义方法前,如果使用空字符串会报错,如果定义路由后面带有’/’,访问不带’/’的路由会重定向到带’/’的路由;如果定义的路由后面不带’/’,则访问时带’/’会报’not found’错误。
- 路由变量
@app.route('/profile/')
def profile(username):
return 'username=%s' % username
@app.route('/article/')
def article(id):
return 'article id=%d' % id
参数值类型可分为int,float,string三类,默认类型为string,路由要以’/’开头,否则报错。
from flask import url_for
@app.route('/article/')
def article(id):
#return url_for('about')
#return url_for('profile',username='songzw')
return url_for('project',id='2',test='test')
return 'article id=%d' % id
url_for第一个参数是路由对应的方法名,后面的参数如果对应路由规则中的参数则会相应赋值,否则作为get参数传值,url_for生成的路由转义特殊字符和unicode数据
@app.route('/login', methods=['get','post'])
def login():
if request.method == 'POST':
return 'post'
else:
return 'get or other'
request.method要求是大小匹配
@app.route('/hello')
def hello():
return url_for('static',filename = 'style.css')
输出/static/style.css