flask入门hello world

app的建立和运行。
render_template及form表单数据的前端后端传递。

后端:
render_template(‘index.html’, object=obj)
前端:
{{param}}
{% for i in contents %}
{% endfor %}

Flask 第一个程序 HelloWorld!

from flask import  Flask
app = Flask(__name__)

通过以上代码创建Flask对象,将__name__参数传递给Flask程序,这个参数决定程序的根目录。

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

app.route指定路由,保存了一个URL和对应的函数的映射关系。

index为视图函数,可以包含HTML简单字符串和表单等,通过浏览器展示。

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

app.run()启动程序

更多资料

Flask官网:http://flask.pocoo.org/

Flask中文翻译:http://dormousehole.readthedocs.io/en/latest/

Jinja文档:http://jinja.pocoo.org/docs/dev/templates/

Jinja中文文档:http://docs.jinkan.org/docs/jinja2/

常用代码解释

from flask import Flask

app = Flask(__name__)


'''
app.route(rule,options)
rule : 绑定的是URL与函数  例如:http://127.0.0.1/
options:可选参数  例如: GET, POST
'''
@app.route('/')
def hello_world():
    return 'Hello world'

# flask 传入参数
# http://127.0.0.1:5000/hello/<name>
@app.route('/hello/<name>')
def hello(name):

    s = '<h1>hello {}</h1>'.format(name)

    return s




# flask 转换器
# 这里转换器 只能为int 类型
# http://127.0.0.1:5000/user/1
@app.route('/user/<int:userid>')
def user(userid):

    u = '这是用户为%d'%userid

    return u

 
if __name__ == '__main__':
    '''
    app.run() 就是Flask的一个方法
    参数说明:
        app.run(host,port,debug,options)
        host 主机名称
        port 端口号
        debug 调式模式,默认是false,如果设置成true  服务器会在代码修改后自动重新加载
        options 可选参数
    '''
    app.run(debug=True)

render_template 用法

我们之前的视图函数,返回的都是简单的'Hello Wolrd'之类的字符串,怎么返回一个html呢?首先我们在templates文件夹建立一个html文件,内容随便写一点如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
<h1>This is index page</h1>
</body>
</html>

我们可以使用Flask对象appsend_static_file方法,使视图函数返回一个静态的html文件,但现在我们不使用这种方法,而是使用flaskrender_template函数,它功能更强大。
flask中导入render_template,整体代码如下:

from flask import Flask, render_template
import config
 
app = Flask(__name__)
app.config.from_object(config)
 
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == '__main__':
    app.run()

render_template函数会自动在templates文件夹中找到对应的html,因此我们不用写完整的html文件路径。用浏览器访问'/'这个地址,显示结果如下:

那么为何称之为模板呢?因为render_template不仅能渲染静态的html文件,也能传递参数给html,使一个html模板根据参数的不同显示不同的内容,这是因为flask使用了jinja2这个模板引擎。要使用模板,在render_template参数中以key=value形式传入变量,在html中使用{{key}}来显示传入的变量,例如:

# 视图函数
@app.route('/')
def index():
    return render_template('index.html', contents='This is index page')
 
# html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
<h1>{{ contents }}</h1>
</body>
</html>

浏览器显示的结果与上文是一样的。我们还可以直接把一个类的实例传递过去,并在模板中访问类的属性,例如假设一个类对象objab属性,关键部分的代码如下:

# 视图函数中
return render_template('index.html', object=obj)
 
...
# html中
<p>a: {{ object.a }}</p>
<p>b: {{ object.b }}</p>

传入一个字典也可以,并且在模板中既可以用dict[key],也可以用dict.key。

使用过滤器,可以在html中对传入的变量进行处理,其格式是{{ 变量 | 过滤器 }},例如将前文的{{ contents }}修改为{{ contents | upper}},浏览器显示的内容就变成了:

所以我们可以很容易就理解,过滤器其实就是以变量为参数的函数,返回处理后的结果,在后端一样可以先用字符串对象的upper()函数处理好再传递给模板,效果是完全一样的。jinja2自带了一些过滤器,例如length/reverse/lower等等 ,并且我们也可以自己按照需求自定义过滤器,模板还支持{{ 变量 | 过滤器1 | 过滤器2 | … }}这样的操作。想要深入了解的话,可以搜索jinja2过滤器去进一步学习。

模板中还可以使用if else和for in控制语句,与变量使用{{ }}不同,控制语句要放在{% %}里,例如前文的contents传入一个list:

contents=[i for i in range(10)]

html中代码如下:

<h1>
    {% for i in contents %}
        {{ i }}{# 注意i也要用两个大括号 #}
    {% endfor %}
</h1>

使用for遍历contents的内容,并用{{ i }}显示出来,同时还用{# #}加了一个注释,还要注意需要使用{% endfor %}来提示循环区域的结束,因为html不像python那样通过缩进来判断循环的区域,if也是同理。浏览器显示结果:

最后forif结合使用:

<h1>header</h1>
    {% for i in contents %}
        <p>
        {% if i%2 == 0 %}
            {{ i }}是偶数{# 注意i也要用两个大括号 #}
        {% else %}
            {{ i }}是奇数
        {% endif %}
        </p>
    {% endfor %}

结果如下 :

发表评论

邮箱地址不会被公开。 必填项已用*标注