1. 如何指定接收多个HTTP请求方法?
我们只需要在写路由时,在路由名后加上一个参数methods,即用列表将你可能使用的方法加入即可。@app.route('/login/', methods=['GET', 'POST'])
2. 如何判断用户请求的HTTP方法?
需要导入request模块,并用其中的method方法就可以if request.method == 'POST':
3. 如何获取用户POST请求提交的表单数据?
需要导入request模块,并用其中的form方法就可以request.form ##这个是直接获取所有的
user = request.form['user'] ###这个是获取html中标签名为user的
4. 模板渲染(jinja2)
1.使用模板的原因及用法
python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html 文件)分开的, 使得代码的可读性增强, 代码容易理解和维护。由于python中生成html不易修改与维护, 所以将html的内容独立到templates目录中(一定要使用这个名字)模板渲染: 在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
其他的模板引擎: Mako, Template, Jinja2
方法:
1). 去当前项目目录下寻找templtes是否存在?再去判断templates目录下是否有login.html文件?
2). 读取这个login.html文件的内容, 作为render_template的返回值;
3). 最终返回给用户浏览器;
1.模板的表达式都是包含在分隔符”{{ }}”内的,表达式一般有以下情况:
2.控制语句都是包含在分隔符”{% %}”内的;
Jinja2的控制语句主要就是条件控制语句if,和循环控制语句for,语法类似于Python。
if控制语句要用”{% endif %}”来结束,同if语句一样,for控制语句要用”{% endfor %}”来结束。页面上,每个元素之间会有空格,如果你不希望有空格,就要在”for”语句的最后,和”endfor”语句的最前面各加上一个”-“号。
3.模板也支持注释,都是包含在分隔符”{# #}”内,支持块注释。
具体的用法将在下面的例子中使用到。
2. 过滤器与自定义过滤器
import time
from flask import Flask, render_template
app = Flask(__name__)
class User(object):
def __init__(self, name, passwd):
self.name = name
self.passwd = passwd
def __str__(self):
return "<User: %s>" % (self.name)
# 自定义一个转换时间格式的过滤器
@app.route('/')
def index2():
name = " this is a message"
li = [1, 2, 4, 5]
d = dict(a=1, b=2)
liDict = [
{
'count': 100,
'price': 30
},
{
'count': 110,
'price': 20
},
]
u = User("westos", "passwd")
timestamp = time.time()
return render_template('index2.html',
name=name,
li=li,
d=d,
u=u,
liDict=liDict,
timestamp=timestamp
)
def format_date(value, format="%Y-%m-%d %H:%M:%S"):
# 时间戳----> 元组
ttime = time.localtime(value)
# 元组 --- > 指定字符串
return time.strftime("%Y-%m-%d %H:%M:%S", ttime)
app.add_template_filter(format_date, 'format_date')
@app.route('/index3/')
def index3():
return render_template('index3.html',
timestamp=time.time())
app.run(port=5004)
3.宏macro的使用
使用这个,我们可以将在html中类型一样,参数不一样的标签使用宏表达出来,可以减少我们代码的重复量{# 宏: 是一个函数 #}
{% macro input(type, name, text ) %}
<div class="form-group">
<label>{{ text }}</label>
<input name={{ name }} type={{ type }} class="form-control">
</div>
{% endmacro %}
4.模板的继承
模板继承语法:
1. 如何继承某个模板?
{% extends "模板名称" %}
2. 如何挖坑和填坑?
挖坑:
{% block 名称 %}
默认值
{% endblock %}
填坑:
{% block 名称 %}
{% endblock %}
3. 如何调用/继承被替代的模板?
挖坑:
{% block 名称 %}
默认值
{% endblock %}
填坑:
{% block 名称 %}
#如何继承挖坑时的默认值?
{{ super() }}
# 后面写新加的方法.
........
{% endblock %}
5. 重定向
redirect ###后跟路由名
render_template('login.html) ## 后跟html
6. 404处理
@app.errorhandler(404)
def not_found(e):
return render_template('404.html')
# 抛出异常
@app.route('/user/<int:user_id>/')
def user(user_id):
if 0<int(user_id)<=100:
return "欢迎访问: %s" %(user_id)
else:
abort(404)
app.run(port=5002)
7.session操作
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
该模块需要从flask包中导入
from flask import Flask, session
import random
app = Flask(__name__)
app.config['SECRET_KEY'] = random._urandom(24) # 设置是24位的字符, 每次运行服务器的secret_key都是不同的,
# 服务器重启后会清除上一次存储的session信息值;
# 设置session值;
@app.route('/')
def index():
# 如何设置session的key-value值
session['name'] = 'westos'
return "hello world"
@app.route('/get/')
def get():
# 如何获取?
return session.get('name')
@app.route('/delete/')
def delete():
# 如何删除?
print(session.get('name'))
session.pop('name') ##删除
print(session.get('name'))
return 'delete'
app.run(port=5001)
综合上述所有常见问题,我会将其用于一个例子中,做详细讲解。
例:用户的登陆,注册
首先在这里说一下我们如何创建一个较为标准的工程
1.创建一个名为static(一般都用这个名,但是你也可以换 )的目录,用来存放一些css样式和字体等
2.创建一个名为templates的目录,用来存放我们主页,登陆等一些html文件
3.再创建一个我们的主程序(一般命名为run.py)