美文网首页
flask从0到无(模版注入铺垫)

flask从0到无(模版注入铺垫)

作者: 帅猪佩奇 | 来源:发表于2018-12-16 21:44 被阅读24次

零基础学起

学习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/

相关文章

  • flask从0到无(模版注入铺垫)

    零基础学起 学习flask我选择了 pycharm,学生的话可以免费下载专业版。废话不多说了。 环境:python...

  • flask模版 Jinja2使用笔记

    Flask模版 jinjan2 使用模版 在渲染模版时,默认会从项目根目录下的templates文件夹下查找 模版...

  • 渲染模版

    Flask框架渲染jinja模版:一、如何渲染模版:--1.模版放在‘templates’文件夹下;--2.从‘f...

  • Flask 渲染jinja2模版和传参

    1.如何渲染模版: *模版放在‘template’文件夹下 *从flask中导入render_temp...

  • flask二、Template模版引擎(Jinja2)

    Flask Template模版引擎(Jinja2) Flask利用Jinja2作为模版引擎。模版引擎包含了变量和...

  • Flask安装,快速应用,配置文件

    目录 0.Flask简介 安装 werkzeug简介 flask快速使用 配置文件 0.Flask简介 Flask...

  • 从0到0,从0到1。

    昨天和一客户交流,听到这么一句话,我现在的阶段勉强算0到0的阶段,到那个1的阶段还没有看到,或者说并不知道那个1在...

  • 从0到0

    我们降临世间 感受人情冷暖 尝遍酸甜苦辣 走过荆棘坎坷 收获功成名就 最后带着所有乱世繁华 走进黄土白骨

  • 从0到0

    隔壁病床的老爷爷今年79了,神志老是半清不醒的。晚上陪床的阿姨考考他,问他自己儿子,女儿,孙子外孙的名字,老人答得...

  • 从Flask到FastApi

    大家好,这里是米洛,一个想和大家一起分享测试开发相关的技术,面试经验和成长经历的博主! 欢迎大家关注我的公众号: ...

网友评论

      本文标题:flask从0到无(模版注入铺垫)

      本文链接:https://www.haomeiwen.com/subject/hnffkqtx.html