零基础学起
学习flask我选择了 pycharm,学生的话可以免费下载专业版。废话不多说了。
环境:python 3.6+
基础:0-
日期:2018.12.14
flask入门
简单测试
pycharm安装flask会自动导入了flask所需的模块,所以我们只需要命令安装所需要的包就可以了,建议用python3.6学习而不是2.7,毕竟django都快要不支持2.7了,早换早超生。
自动导入的也是python 3.6。
运行这边会出小错,因为此时我们还没有安装flask包,
这样就可以正常运行了,运行成功便会返回
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [14/Dec/2018 20:32:20] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [14/Dec/2018 20:32:20] "GET /favicon.ico HTTP/1.1" 404 -
此时可以在web上运行hello world了,访问http://127.0.0.1:5000。可以看到打印出Hello World
route装饰器路由
@app.route('/')
使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。 route() 装饰器把一个函数绑定到对应的 URL 上,这句话相当于路由,一个路由跟随一个函数,如
@app.route('/')
def test()"
return 123
访问127.0.0.1:5000/ 则会输出123,我们修改一下规则
@app.route('/test')
def test()"
return 123
这个时候访问127.0.0.1:5000/test 会输出123。
此外还可以设置动态url,
@app.route("/hello/<username>")
def hello_user(username):
return "user:%s"%username
根据url里的输入,动态辨别身份,此时便可以看到如下页面:
或者可以使用int型,转换器有下面几种:
int 接受整数
float 同 int ,但是接受浮点数
path 和默认的相似,但也接受斜线
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
main入口
当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。如果你经常以cmd方式运行自己写的python小脚本,那么不需要这个东西,但是如果需要做一个稍微大一点的python开发,写 if __name =='__main__' 是一个良好的习惯,大一点的python脚本要分开几个文件来写,一个文件要使用另一个文件,也就是模块,此时这个if就会起到作用不会运行而是类似于文件包含来使用。
if __name__ == '__main__':
app.debug = True
app.run()
测试的时候,我们可以使用debug,方便调试,增加一句
app.debug = True
或者(效果是一样的)
app.run(debug=True)
这样我们修改代码的时候直接保存,网页刷新就可以了,如果不加debug,那么每次修改代码都要运行一次程序,并且把前一个程序关闭。否则会被前一个程序覆盖。
app.run(host='0.0.0.0')
这会让操作系统监听所有公网 IP,此时便可以在公网上看到自己的web。
http请求方法
页面需要get请求或者post请求也可以由路由来解决,通过 route() 装饰器传递 methods 参数。如我们要在登录页面使用get或者post登录输入。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
模版渲染
何为模版渲染 点击连接--->>> https://shuaizhupeiqi.github.io/2018/11/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/
你可以使用 render_template() 方法来渲染模板。你需要做的一切就是将模板名和你想作为关键字的参数传入模板的变量。这里有一个展示如何渲染模板的简例:
简单的模版渲染示例
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
flask简单实例
我们从模板渲染开始实例,因为我们毕竟不是做开发的,flask以模板注入闻名,所以我们先从flask模版渲染入手深入剖析。
首先要搞清楚,模板渲染体系,render_template函数渲染的是templates中的模板,所谓模板是我们自己写的html,里面的参数需要我们根据每个用户需求传入动态变量。
├── app.py
├── static
│ └── style.css
└── templates
└── index.html
我们写一个index.html文件写templates文件夹中。
<html>
<head>
<title>{{title}} - 小猪佩奇</title>
</head>
<body>
<h1>Hello, {{user.name}}!</h1>
</body>
</html>
里面有两个参数需要我们渲染,user.name,以及title
我们在app.py文件里进行渲染。
@app.route('/')
@app.route('/index')#我们访问/或者/index都会跳转
def index():
user = {'name': '小猪佩奇'}#传入一个字典数组
return render_template("index.html",title='Home',user=user)
这次渲染我们没有使用用户可控,所以是安全的,如果我们交给用户可控并且不过滤参数就有可能造成SSTI模板注入漏洞。
jinja2模板同样支持控制语句,在{% %}中输入我们的代码。如
{% if title %}
<title>{{title}} - xzpq</title>
{% else %}
<title>Welcome to xzpq</title>
{% endif %}
如果传入title参数那么执行{{title}} - xzpq 否则执行Welcome to xzpq 最后执行下面未写出。
本文暂且到这里,主要是为了配合ssti模板注入而了解flask注入。看继续参考博文SSTI模板注入。
测试的代码贴上
from flask import Flask
from flask import render_template
from flask import request
from flask import render_template_string
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
@app.route('/',methods=['GET', 'POST'])
@app.route('/index',methods=['GET', 'POST'])#我们访问/或者/index都会跳转
def index():
return render_template("index.html",title='Home',user=request.args.get("key"))
@app.route('/test',methods=['GET', 'POST'])
def test():
template = '''
<div class="center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>
</div>
''' %(request.url)
return render_template_string(template)
if __name__ == '__main__':
app.debug = True
app.run()
---
参考:http://www.pythondoc.com/flask-mega-tutorial/