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

零基础学起

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容