一、flask模板的概念
是一个使用python编写的轻量级web应用框架,使用jinjia模板引擎来渲染html页面,可以直接用flask。
模板的作用是使用静态的页面html展示动态的内容。模板其实是一个响应文本的文件,其中变量表示动态部分,告诉模板引擎具体的值需要从使用的数据中获取,使用真实值替换变量,得到字符串的过程被称为渲染。
二、flask基础知识
1.特点:良好的文档,丰富的插件,包含开发服务器和调试器,集成支持单元测试,RESTful请求调度、支持安全cookie,基于Unicode启动一个web服务页面。
2.使用flask构造网站
基础构造
from flask import Flask #flask模块中导入flask主键
app = Flask(__name__) #__name__是系统遍历,指该文件的文件名
@app.route('/aaa') ##定义路由 ,/aaa表示访问网页时后面携带的路径,也就是说要想执行如下内容,在访问url时需要访问127.0.0.1:5000/aaa
def hello():
return "hello word"
if __name__=='__main__': ##表示程序直接运行时,运行下面的语句
app.run()
这里的run()中有host、port、debug三个参数,其中host=0.0.0.0表示监听任意接口,debug=True表示python出错时他会给我们报错,定位出错在哪,并且在修改文件后文件会自己重启,只能在开发时使用。port=90参数可以修改端口,但是换需要自己手动重启,上面代码的执行效果如下。
传参型,
动态变量方式:
from flask import Flask
app = Flask(__name__)
@app.route('/bbb/<name>') ##name为我们的变量,浏览器会把<name>的部分传入函数中,也就是说name是可变的
def aaa(name):
return "hello %s" % name #%s表示只能传入字符型
@app.route('/int/<int:postID>')
def id(postID):
return "%d" % postID ##%d表示只能传入整型,%f表示浮点型
if __name__=='__main__':
app.run()
http方法:
方法 | 描述 |
get | 以未加密的方式将数据发送到服务器 |
head | 和get方式相同,但是没有响应头 |
post | 用于将表单数据发送到服务器,post方法接收的数据不由服务器缓存 |
put | 用上传的内容替换目标资源的所有当前表示 |
delete | 删除由url给出的目标资源的所有当前表示 |
可以创建一个外部文件,文件内容为post或get传参的html代码。然后使用render_template()函数将文件引用进来。创建项目时,主文件也就是flask模块文件需要放在外部文件的同级目录下的templates目录下。
html页面代码如下
<html>
<body>
<form action = "http://127.0.0.1:5000/login" method="POST">
<p>enter name:</p>
<p><input type="text" name="ben"/></p>
<p><input type="submit" name="submit"/></p>
</form>
</body>
</html>
app.py网页传参代码如下
from flask import Flask,redirect,url_for,request,render_template
app=Flask(__name__)
@app.route('/')
def index():
return render_template("index.html") #加载index.html页面
@app.route('/success/<name>') ##显示welcome对应名字
def success(name):
return 'welcome %s' %name
@app.route('/login',methods=['POST','GET'])#通过post或get方法提交数据
def login():
if request.method=='POST': #如果时post传输
print(1)
user=request.form['ben']
return redirect(url_for('success',name = user)) #redirect重定向,将user的值复制给name,页面返回为success界面
else:
print(2)
user=request.args.get('ben')
return redirect(url_for('success',name = user))
if __name__=="__main__":
app.run()
传参操作
3、函数介绍
render_template:加载(渲染)html文件。默认文件路径在templates目录下,当你进入127.0.0.1:5000时,它呈现的页面是index.html的内容
例:a.py
from flask import Flask,render_template,request
app = Flask(__name__)
@app.route('/')
def index():
my_str = 'Hello benben!'
my_int = request.args.get('min')
my_array = [5,2,0, 1,3,1,4]
my_dict = {'name':'dazhuang',
'age': 18}
return render_template('index.html', ##render_template方法:渲染模板,参数1:模板名称为index.html,参数n:传入模板的数据
my_str=my_str,
my_int=my_int,
my_Larray=my_array,
my_dict=my_dict)
if __name__=='__main__':
app.run()
index.html,显示my_str变量的值,{ {}}调用变量,{%set 变量= %}用于设置一个值
<html>
<body>
{
{my_str}} <br>
{
{my_int}} <br>
{% set a='minminmin'%} {
{a}}
</body>
</html>
运行结果
render_template_string:用于渲染字符串,直接定义内容。
例:b.py
from flask import Flask,render_template_string,request
app = Flask(__name__)
@app.route('/',methods=['GET'])
def index():
my_str = 'Hello benben!'
my_int = request.args.get('min')
my_array = [5,2,0, 1,3,1,4]
my_dict = {'name':'dazhuang',
'age': 18}
return render_template_string('<html lang="en"><head><meta charset="UTF-8"><title>123</title></head><body>模板展示<br>%s<br>%s</body></html>' %(my_str,my_int))
if __name__=='__main__':
app.run()
三、注入形成原因
程序员使用jinjia语言渲染引擎进行网页渲染时,因处理不当,未进行语句过滤,用户输入{ {}}控制语句导致渲染出恶意代码形成注入。攻击者可以通过该注入点获取系统中需要的信息。
查找注入点,