from flask import Flask 导入Flask扩展 app = Flask(__name__) 创建Flask应用实例 __name__的作用:为了确认资源所在路径 @app.route('/') 定义路由及视图函数 def index(): 路由默认只支持GET return 'hello world' if __name__ == '__main__': 启动程序 app.run(debug=True) 执行了app.run(),就会将Flask程序运行在一个简易的服务器上 服务器由Flask提供,用于测试 1、返回网页 可以导入render_templates来返回一个网页,同时新建一个.html文件(假设名为index.html) 使用时只需要return render_templates('index.html') 2、路由定义的基本方式 路由默认只支持GET,需要添加,需要自行在method中指定 3、给路由进行传参 有时我们需要将同一类URL映射到同一个视图函数中进行解析。例如:使用同一个视图函数显示不同的用户订单信息 路由传递的参数默认当string处理 需要在视图函数的()内填入参数名 <>里面是定义路由的参数 note:写路由时不要在末尾加上/ 4、host:'0.0.0.0'意为允许外网访问(默认情况下只能本机访问) debug=True意为开启debug调试模式,代码改变浏览器自动重载,适用于development环境;反之,debug=False适用于production环境 5、设置配置文件settings.py(大写) 调用方法:app.config.from_object(settings) 需要导入 或者app.config.from_pyfile('settings') 6、request和response对象 请求行:URL,请求方法(默认GET) 请求头:键值对 默认GET没有请求体 响应行:状态码 响应头:键值对 响应体:内容
7、路由的变量规则
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings)
data = {'a':'beijing', 'b':'shanghai', 'c':'xian'}
@app.route('/test')
def index():
return '大家好'
@app.route('/getcity/<key>') #URL里出现的变量名在函数括号里也必须声明
def getcity(key):
return data.get(key)
@app.route('/add/<int:num>')
def add(num):
result = num + 15
return str(result) #不能返回整形
@app.route('/index/<path:p>')
def getpath(p):
return p
@app.route('/test/<uuid:id>')
def test(id):
return '获取唯一标识码'
@app.route('/index404')
def err():
return 'sorry! the file is not found!', 404
if __name__ == '__main__':
app.run(port=8080)
利用返回response对象来实现在内容里加标签:
@app.route('/response')
def area():
return Response('<h1>西安</h1>')
4、Jinja2模板引擎
导入render_template
render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值
两个视图函数不能引用同一个模板
用{{}}来表示变量名,这种语法叫做变量代码块
用{# #}来进行注释
app.py:
index.html:
output:
举例:
app.py:
from flask import Flask, request, render_template
import settings
app = Flask(__name__)
app.config.from_object(settings)
@app.route('/register', methods=['GET', 'POST'])
def register():
print(request.path)
print(request.full_path)
print(request.args)
print(request.args.get('username'))
print(request.args.get('address'))
print(request.form) #POST方法需要用form方法获取数据
print(request.form.get('username'))
print(request.form.get('address'))
return '成功进入'
@app.route('/index')
def index():
r = render_template('index.html')
return r
if __name__ == '__main__':
print(app.url_map) #打印路由规则表
app.run()
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
div{
width:100%;
height:200px;
border:2px solid red;
}
</style>
</head>
<body>
<h1>
欢迎来到对抗路!
</h1>
<div>
<ul>
<li>hello</li>
<li>abc</li>
<li>world</li>
</ul>
<form action="/register", method="post">
<p><input type="text" name = 'username' placeholder="请输入用户名"></p>
<p><input type="text" name = 'address' placeholder="请输入密码"></p>
<p><input type="submit" value="提交"></p>
</form>
</div>
</body>
</html>
5、变量代码块的使用
用{{}}来表示变量名,这种语法叫做变量代码块
app.py:
index.html:
output:
6、控制代码块
用{% %}定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句
app.py:
index.html:
output:
7、过滤器
过滤器的本质就是函数,有时候我们不仅仅是需要输出变量的值,我们还需要修改变量的提示,甚至格式化、运算等,而在模板中不能直接调用python的某些方法,因此就需要过滤器。
过滤器的使用方法:变量名 | 过滤器
{{variable | filter_name(*agrs)}} (没有参数可省略括号)
在Jinja2中,过滤器支持链式调用,其格式为:
{{ 'hello world' | reverse | upper }}
8、处理Web表单
Web表单是Web应用程序的基本功能,是HTML页面中负责数据采集的部件,由表单标签、表单域和表单按钮三部分组成。
在Flask中,为了处理表单,一般使用Flask-WTF扩展,它封装了WTForms,并且有验证表单数据的功能。
例:
目的:实现一个简单的登陆登录逻辑处理
tips:(1)路由需要有GET和POST两种请求方式 -->需要判断请求方式
(2)获取请求的参数
(3)判断参数是否填写 & 密码是否相同
(4)如果判断没问题,返回success
导入request -->一个请求对象,可以获取请求方式、数据
不足:报错只能在后台查看,希望将错误信息显示在网页上
9、改进
用flash给模板传递消息 -->需要对内容加密,即需要设置secret key,做加密消息的混淆
模板中需要遍历消息
u解决编码问题