vlambda博客
学习文章列表

Day30/100 Flask中的变量和HTTP方法?

文 | 酷头

来源:印象python「ID: python_logic」

嗨!大家好,我是酷头
欢迎来到学习python的宝藏基地~~~
今天给大家介绍Flask中的变量和HTTP方法,一起来看看吧!



长按下方二维码可以添加我为好友哦

Day30/100 Flask中的变量和HTTP方法?


Day30/100 Flask中的变量和HTTP方法?


https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3MjU2NzkyMA==&action=getalbum&album_id=1776320890310295553#wechat_redirect

上节我们认识了我们web程序的入门经典'hello world'
今天我们看的内容有两个,一个变量,一个模板



变量



当我们在@app.route()中添加URL时,URL有时候是有变化的,例如我们常见到的不同登陆用户的名称,不同商品的ID等


针对这种情况,我们就需要构造动态的URL。这就需要给URL添加变量部分

变量的命名规则是<变量名>

如果需要指定变量类型,那就是<变量类型:变量名>


我们来看一组实例,根据不同用户名称输出相应的用户信息


from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello world'

@app.route('/user/<username>')
def show_username(username):
    return f'欢迎{username}光临!'

if __name__ == '__main__':
    app.run(
        debug=True,
        port=8888
    )


Day30/100 Flask中的变量和HTTP方法?



我们再来看一组指定变量类型的实例

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello world'
    
@app.route('/id/<int:id_no>')
def show_id(id_no):
    return f'该产品的id是{id_no}'


if __name__ == '__main__':
    app.run(
        debug=True,
        port=8888
    )


Day30/100 Flask中的变量和HTTP方法?



如果你输入其它类型的数据则会报错


Day30/100 Flask中的变量和HTTP方法?





构造URL




如果flask能匹配URL,那么就可以生成它们.

这里我们使用url_for()来给指定的函数构造URL,他的第一个参数是函数名

其余参数会添加到URL末尾作为查询参数


使用url_for()函数可以构造url, 所以它经常结合redirect()函数用来跳转页面

url_for()和redirect()函数需要从Flask模块导入


from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello world'

@app.route('/login')
def login():
    flag = 'success'
    if flag:
        return redirect(url_for('index'))
    return '登陆页面'


if __name__ == '__main__':
    app.run(
        debug=True,
        port=8888
    )


会调用login()方法.

若果登陆成功的话,就是使用redirect()函数跳转至index方法,如下:


Day30/100 Flask中的变量和HTTP方法?





HTTP方法



HTTP,即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。

Day30/100 Flask中的变量和HTTP方法?

http(web应用会话协议)有许多不同的访问URL方法,默认情况下,

路由只回应get方法.

如果我们有其他请求的话,需要通过route()装饰器传递method()参数

来改变这个行为


@app.route('/login', methods = ['GET','POST'])
def login():
    if request.method == 'POST':
        xxxx11
    else:
        xxxx22


常见HTTP方法


Day30/100 Flask中的变量和HTTP方法?





静态文件



动态web程序也需要静态文件,该文件通常是css和Javascript文件.

默认情况,这些静态文件都是放在一个名为static的文件夹中的

目录如下:


Day30/100 Flask中的变量和HTTP方法?




那么如何给静态文件生成URL呢,我们可以使用特殊的'static'端点名


url_for('static', filename = 'style.css')


使用上url_for()函数可以生成style.css文件的目录,

即为'static/style.css'




模板



模板是一个包含响应文本的文件,包含使用占位符表示的动态部分,具体值在请求上下文才能知道。

使用真实值替换变量,得到返回字符,这一过程称之为渲染。




模板渲染



默认情况下,Flask在程序文件夹templates子文件夹中寻找模板.

使用render_template()渲染模板


render_template('template_name.html', var_name = name)


render_template()函数需要从Flask函数导入,它的第一个参数是渲染模板的名称

其余参数为模板变量的值


我们来看一组实例


我们在template文件夹下创建文件,命名为index.html

然后在run.py中渲染该文件


Day30/100 Flask中的变量和HTTP方法?


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/css/bootstrap.css">
    <script src="/static/js/jquery.js"></script>
    <script src="/static/js/bootstrap.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm bg-primary navbar-dark">
  <ul class="navbar-nav">
    <li class="nav-item active">
      <a class="nav-linkhref="#">首页</a>
    </li>
    <li class="nav-item">
      <a class="nav-linkhref="#">德玛西亚</a>
    </li>
    <li class="nav-item">
      <a class="nav-linkhref="#">诺克萨斯</a>
    </li>
    <!-- Dropdown -->
    <li class="nav-item dropdown">
      <a class="nav-link dropdown-toggle" href="#"
          id="navbardrop" data-toggle="dropdown">
        关于我们
      </a>
      <div class="dropdown-menu">
        <a class="dropdown-item" href="#">公司简介</a>
        <a class="dropdown-item" href="#">企业文化</a>
        <a class="dropdown-item" href="#">联系我们</a>
      </div>
    </li>
  </ul>
</nav>
<div class="jumbotron">
  <h1 class="display-3">欢迎来到{{country_name}}</h1>
  <p >
      {{messages}}
  </p>
  <hr class="my-4">
  <p>
    <a class="btn btn-primary btn-lg" href="#" role="button">了解更多</a>
  </p>
</div>
</body>
</html>


模板的样子如下:


Day30/100 Flask中的变量和HTTP方法?


我们在run.py给变量加入具体的值


from flask import Flask, render_template

app = Flask(__name__)

@app.route('/index')
def index():
    name = '德玛西亚'

    message = '''
    在凶险海域环绕中,诸多同盟省份在一片被称为“初生之土”的庞大群岛上组成了艾欧尼亚。追寻万物的平衡是这里长久以来的文化基调,因此物质与精神领域之间的界限也在这里若有若无,在野外的森林和山脉中尤为如此。
    虽然这片土地上的魔力可能变幻无常,栖息着的生物也可能危险而神奇,但在过去的几百年中,艾欧尼亚的居民一直过着富足的生活。习武的僧院、各省的民兵团、甚至就连艾欧尼亚这片土地本身,都已经足够保护当地的居民。
    但那一切都在十二年前结束了,因为那一年,诺克萨斯出兵攻打了“初生之土”。一望无际的帝国大军在艾欧尼亚肆虐,艾欧尼亚人经过多年的苦战才以巨大的代价击败敌人。如今的艾欧尼亚正处于脆弱的和平中。对于那场战争的不同应对,
    让这片土地产生了分裂——有一些团体,例如朔极的武僧和均衡教派,想要回归与世隔绝的和平以及田园牧歌的传统。另一些比较激进的派系,例如纳沃利兄弟会和影流,则主张对这片土地的魔法进行军事化改造,建立一个统一的国家,
    强大到足以对诺克萨斯实施打击报复。艾欧尼亚的命运正悬在微妙的平衡中,几乎无人愿意使其倒向任何一边,但所有人都能感到脚下的土地在蠢动不安
    '''

    return render_template('index.html', country_name = name, messages = message)

if __name__ == '__main__':
    app.run(
        debug=True,
        port=8888
    )


当我们访问URL:127.0.0.1:8888/index

就会打印出如下信息:


Day30/100 Flask中的变量和HTTP方法?


Flask提供的render_template()函数把Jinja2模板引擎集成到了程序中

render_template()第一个参数是模板的文件名,随后的值都是键值对。

便是模板中变量对应的真实值。



在此代码中country_name = name, messages = message都属于关键字参数。

左边的country_name表示参数名,就是模板中的占位符

右边的name就是当前作用域的变量名,表示这个参数的值。


下一节我们看Flask中强大的过滤器!