Python web学习之Flask框架
一、flask基础
1、flask简介
Flask是一个使用 Python 编写的轻量级 Web 应用框架。
模板引擎使用Jinja2。
协议使用WSGI协议。
2、Flask的安装
建议在虚拟环境下的终端输入:
pip install Flask
3、第一个Flask程序
使用下述代码创建一个Flask实例对象
from flask import Flask
app = Flask(__name__)
注意:必须从flask中引入Flask对象
定义视图函数
@app.route('/')
def hello_world():
return 'Hello World!'
app.route装饰器映射URL和执行的函数。这个设置将根URL映射到了hello_world函数上
4、项目配置
在项目目录下创建config.py 文件
引入配置项两种方式:
app.config.from_object(config)
silent=True 表示如果配置文件不存在的时候不抛出异常
app.config.from_pyfile('config.py',silent=True)
例如:app.py中书写Hello World
from flask import Flask
app = Flask(__name__)
app.config.from_object(config)
@app.route('/')
def hello_world():
return "hello world"
if __name__ == "__main__":
app.debug = True
app.run()
5、URL与视图
上述已经提到过@app.route 装饰器中,可以指定URL。
1、URL传递参数
语法: @app.route('.../<参数名>/')
例如:传递用户的id作为url参数
from flask import Flask
app = Flask(__name__)
@app.route('/user/<id>')
def user(id):
return "用户id为: {}".format(id)
if __name__ == "__main__":
app.debug = True
app.run()
2、URL反转
根据视图函数名称得到当前所指向的URL
url_for() 接收两个及以上的参数
from flask import Flask
app = Flask(__name__)
def index():
url=(url_for('user',id='2022'))
return "URL反转内容为{}".format(url)
@app.route('/user/<id>')
def user(id):
return "用户id为: {}".format(id)
if __name__ == "__main__":
app.debug = True
app.run()
也可以使用url_for() 来引入外部文件
<script type="text/javascript" src="{{ url_for('static',filename='js/jquery.js') }}"> </script>
<img src="{{url_for('static',filename='images/1.jpg')}}" alt="">
6、页面跳转重定向
一般用于,希望用户登陆后才能访问某页面。如果用户未登录,浏览器由当前页跳转到登录页。
语法: redirect(url)
from flask import Flask,redirect
app = Flask(__name__)
@app.route('/')
def index():
url=url_for('user_login')
return redirect(url)
@app.route('/user_login')
def user_login():
return "登录页"
if __name__ == "__main__":
app.run(debug=True)
二、Jinja2模板
1、渲染模板
要渲染一个模板,通过render_template 方法即可
tianhai() 函数会在当前目录下的templates 文件夹下找到tianhai.html 文件进行渲染。
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/tianhai/')
def tianhai():
return render_template('tianhai.html')
如需更改寻找路径,可以给Flask 配置上 template_folder 参数
from flask import Flask,render_template
app = Flask(__name__,template_folder=r'D:\文件\Flask学习\templates')
@app.route('/about/')
def about():
return render_template('about.html')
当需要将参数传递给模板文件时,可以在 render_template() 中配置
@app.route('/about')
def about():
context = {
"age":18,
"username":"天海",
"books":["红楼梦","三体"],
"person":{"name":"天海","age":18},
"content":"<a href='www.baidu.com'>百度</a>"
}
return render_template('about.html',**context)
也可以使用 locals() 将视图函数中所有的变量全部渲染到模板上,
字典类型返回当前位置的全部局部变量
@app.route('/about')
def about():
title='pythonweb'
username="天海"
return render_template('about.html',**locals())
前端模板的使用:想展示title和username中的内容
<h1>
{{title}}
{{username}}
</h1>
2、if条件语句
if条件判断语句必须放在{% if statement %} 中间,并且还必须有结束的标签{% endif %} 。和python中的类似,可以使用>,<,<=,>=,==,!= 来进行判断,也可以通过and,or,not,() 来进行逻辑合并操作。
{% if condition %}
{% else %}
{% endif %}
也可以使用 elif
{% if condition1 %}
{% elif condition2 %}
{% elif condition3 %}
...
{% else %}
3、常用模板过滤器
{{ name|length }} :将name的长度返回
{{names|first}} :将names序列的第一个元素返回
{{names|last}} :将names序列的最后一个元素返回
{{age|int}} :将age转换为int返回
{{-1|abs}} :将-1的绝对值返回
escape(value)或e :转义字符,会将< 、> 等符号转义成HTML中的符号。例如:content|escape 或content|e 。
{{ "%s" - "%s"|format('Hello',"Tian") }} :格式化字符串,返回 Hello - Tian
{{content|replace(content,111)}} :将content替换为 111
{{content|striptags}} :删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
{{content|wordcount}} :计算一个长字符串中单词的个数。
…
4、循环语句
循环可以遍历任何一个序列
普通遍历语法:
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
遍历字典
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key|e }}</dt>
<dd>{{ value|e }}</dd>
{% endfor %}
</dl>
结合else
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
{% endfor %}
</ul>
变量 | 描述 |
---|
loop.index | 当前迭代的索引(从1开始) | loop.index0 | 当前迭代的索引(从0开始) | loop.first | 是否是第一次迭代,返回True或False | loop.last | 是否是最后一次迭代,返回True或False | loop.length | 序列的长度 |
上表用来获取当前的遍历状态
5、测试器
Jinja中常用的内置测试器
测试器 | 说明 |
---|
callable(object) | 是否可调用 | defined(object) | 是否已经被定义了。 | escaped(object) | 是否已经被转义了。 | upper(object) | 是否全是大写。 | lower(object) | 是否全是小写。 | string(object) | 是否是一个字符串。 | sequence(object) | 是否是一个序列。 | number(object) | 是否是一个数字。 | odd(object) | 是否是奇数。 | even(object) | 是否是偶数。 |
用法:
{% if Vue is defined%}
value of Vue: {{ defined }}
{% else %}
variable is not defined
{% endif %}
6、模板的继承
Jinja中实现了模板的继承。在Vue中,我们可以通过定义单页面组件来实现某一可复用的组件,这里模板的继承和其类似。
用法:
先写一份 base.html 作为可复用继承的页面元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title%}{% endblock%}</title>
{% block head %}{% endblock %}
</head>
<body>
<ul>
<li>
<a href="/">首页</a>
</li>
<li>
<a href="/control">设置</a>
</li>
<li>
<a href="/about">关于我</a>
</li>
</ul>
{% block body %} {% endblock %}
<footer style="background-color:#ccc ">我是底部</footer>
</body>
</html>
在 index.html 中继承该模板:
语法 : {% extends "xxx.html" %}
{% extends "base.html" %}
{% block title %}
首页部分
{% endblock %}
{% block head %}
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
{% endblock %}
{% block body %}
<h1>我是首页</h1>
{% endblock %}
7、静态文件的配置
如上面模板继承中的子页面中, {% block head %} 内部写的那样。
使用 url_for 来加载静态页面
例:其中第一个参数为,目录下需要引入静态文件的文件夹,第二个参数为接上需要引入的文件名在第一个参数写的目录内的路径
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
上述情况为Flask指定的路径,如需自定义可写如下代码
app = Flask(__name__,static_folder='C:\static')
这样就自动寻找 C:\static 目录下的文件了
我是首页 {% endblock %} ```
7、静态文件的配置
如上面模板继承中的子页面中, {% block head %} 内部写的那样。
使用 url_for 来加载静态页面
例:其中第一个参数为,目录下需要引入静态文件的文件夹,第二个参数为接上需要引入的文件名在第一个参数写的目录内的路径
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
上述情况为Flask指定的路径,如需自定义可写如下代码
app = Flask(__name__,static_folder='C:\static')
这样就自动寻找 C:\static 目录下的文件了
|