6.Flask轻量型框架
6.1Flask简介
python提供的框架中已经写好了一个内置的服务器,服务器中的回应response行和头已经写好,我们只需要自己写显示在客户端,的主体body部分。
----------------------------------------------------------
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
----------------------------------------------------------
WSGI接口协议:是python应用程序或框架和web服务器之间的一种接口
6.2安装
在虚拟环境的基础上 cmd打开命令行 workon py1901
执行 pip install Flask (自动把Werzeug和Jinja2安装捆绑安装)
查看 pip list
6.3MVT
python提供的框架中已经写好了一个内置的服务器,服务器中的回应response行和头已经写好,我们只需要自己写显示在客户端,的主体body部分。
主体body中 既有css、js 又有 数据库、python,所以mvt在主体中将他们分成了三个部分
-------------------------------------------------------------
mvt:
model-------->数据库
view--------->视图 url路由 |python代码
template----->模板 html网页 在静态页面中可以写python代码
6.4Flask的初始化方法
def __init__(
self,
import_name,
static_url_path=None,
static_folder='static',
static_host=None,
host_matching=False,
subdomain_matching=False,
template_folder='templates',
instance_path=None,
instance_relative_config=False,
root_path=None
):
6.5路由
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings)
#路由设置
@app.route('/')
def hello_world():
return 'Hello Baby! 啦啦啦啦啦啦 app1'
@app.route('/user/login/')
def login():
return '用户正在登陆.....'
@app.route('/user/register/')
def register():
return '用户正在注册.....'
def order():
print('您正在查看订单.....')#打印在控制台的
return '您正在查看订单.....'#打印在网页的
app.add_url_rule('/orders',view_func=order)
if __name__=='__main__':
print(app.url_map)
app.run(port=8080)
#settings.py文件中:
ENV = 'development'
DEBUG = True
可以看到响应的结果:
通过以上 我们可以看出 —— 定义路由的方式有两种:
#1.使用装饰器
@app.route('/user/login/')
def login():
return '用户正在登陆.....'
@app.route('/user/register/')
def register():
return '用户正在注册.....'
#2.通过add_url_rule实现
def 函数名():
return '您正在查看订单.....'#打印在网页的
app.add_url_rule('路由规则',view_func=函数名)
'''
路有规则就是网址后面那个路径
view_func=函数名 函数名后面不加括号
'''
def order():
return '您正在查看订单.....'#打印在网页的
app.add_url_rule('/orders',view_func=order)
6.6路由的变量规则
=========================================================
默认的就是字符串规则
=========================================================
/<变量>/
from flask import Flask import settings app = Flask(__name__) app.config.from_object(settings) @app.route('/tieba/<keyword>/') #keyward是一个变量 代表着你给我什么我就传什么 def tieba(keyword):#有<>出现了 路由的视图函数里就必须有一个重名的参数出现 return '正在看%s' % keyword if __name__=='__main__': print(app.url_map) app.run(port=8080
=========================================================
int规则
还要设置一个第几页:这里涉及了一个int规则 ———— int:
from flask import Flask import settings app = Flask(__name__) app.config.from_object(settings) #如果不加int的话 page默认的类型就是字符串类型 @app.route('/tieba/<keyword>/<int:page>') #keyward是一个变量 代表着你给我什么我就传什么 def tieba(keyword,page): #有<>出现了 路由的视图函数里就必须有一个重名的参数出现 return '正在看%s,当前是第%d页' % (keyword,page) if __name__=='__main__': print(app.url_map) app.run(port=8080)
注释:当装饰器带参数的时候
def zhuang1(wifename):
def inner1(f):
def inner2(*args,**kwargs):
f(*args,**kwargs)
print("媳妇必须像%s" % wifename)
return inner2
return inner1
@zhuang1('贾玲')
def func2():
print("好好学习,努力挣钱,娶媳妇!")
if __name__ == '__main__':
func2()
'''
如果装饰器带参数
必须要定义三层
'''
=========================================================
float规则
rom flask import Flask import settings app = Flask(__name__) app.config.from_object(settings) @app.route('/tieba/<keyword>/<float:score>') def tieba2(keyword,score): str = '正在看的节目是{},评分是{}.2f '.format (keyword,score) #.2f表示的是小数点后保留2位 return str if __name__=='__main__': print(app.url_map) app.run(port=8080)
path规则
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings)
@app.route('/tieba/<path:pathname>')
def tieba2(keyword,pathname):
return pathname
#http://127.0.0.1:8080/tieba/快乐大本营/9a/b
#拿到的值就是:快乐大本营/9a/b
if __name__=='__main__':
print(app.url_map)
app.run(port=8080)
=========================================================
下面介绍的是使用变量规则
''' 使用路由: 1. 变量规则: @app.route('/tieba/<keyword>/<int:page>') def tieba(keyword, page): print(type(keyword)) # 默认str print(type(page)) return '正在看:%s,当前是第%d页' % (keyword, page) 转换器的类型: int float path 默认:str
======================================================
6.7get请求参数传参
from flask import Flask, request
import settings
app = Flask(__name__)
app.config.from_object(settings)
#超链接和直接拼接在地址栏后面参数,使用的都是get请求
# 使用get请求的参数
# http://127.0.0.1:8080/tieba/?keyword=快乐大本营
@app.route('/tieba/')
def tieba():
# get请求
print(request.args) # 请求参数,都存放在args,底层就是一个ImmutableMultiDict字典对象
keyword = request.args.get('keyword')
page = request.args.get('page')
print('page是:'+page)
# keyword = '快乐大本营'
return '正在看:%s' % (keyword)
# http://127.0.0.1:8080/tieba/?keyword=runningman&page=100
if __name__ == '__main__':
print(app.url_map)
app.run(port=8080)
控制台输入 page=100
6.8Request对象
小知识
dict={ } value = dict.get('keyword') print(value) #----->None value2 = dict.get('keyword','nba') print(value2) #----->nba ''' value3 = dict ['keyword'] print(value3) #----->这种方法报错 '''
先定义一个空字典 取不出来值的话就是none,如果有默认值就是nba
request对象的源代码
current_app = LocalProxy(_find_app) request = LocalProxy(partial(_lookup_req_object, 'request')) session = LocalProxy(partial(_lookup_req_object, 'session')) g = LocalProxy(partial(_lookup_app_object, 'g'))
from flask import Flask, request import settings app = Flask(__name__) app.config.from_object(settings) @app.route('/f') def hello_world(): #request对象已经产生,request:请求行、请求头、请求体 #http://127.0.0.1:5000/f?kw=abc&page=1 print(request.base_url) #http://127.0.0.1:5000/f print(request.full_path) #/f?kw=abc&page=1 print(request.path) #/f print(request.args) #args就是arguments的缩写 ImmutableMultiDict([('kw', 'abc'), ('page', '1')]) value=request.args.get('kw','nba') return 'Hello World!————>' + value if __name__ == '__main__': app.run()
6.8.1超链接
如果有一个表单该怎么做呢?
在template里new一个tieba.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tieba</title>
</head>
<body>
<a href="/zy">快乐大本营</a>
{#如果这里没有/ 但是app.py里的zy后面有/ 那么就重定向到runningman#}
<a href="/zy/?kw=欢乐喜剧人">欢乐喜剧人</a>
<a href="/zy/?kw=王牌对王牌">王牌对王牌</a>
<a href="/zy/?kw=极限挑战">极限挑战</a>
<a href="/zy/?kw=奔跑吧兄弟">奔跑吧兄弟</a>
</body>
</html>
app.py文件:
from flask import Flask,render_template,request
import settings
app = Flask(__name__)
app.config.from_object(settings)
@app.route('/zy')
def zongyi():
return render_template('tieba.html') #模板渲染
@app.route('/zy/') #/zy后面如果有/ 那么tieba.html里的请求路径的zy后面也要有
def zy():
value = request.args.get('kw','runningman')
return '正在看%s' % value
if __name__ == '__main__':
app.run()
点击欢乐喜剧人:
上面的是超链接页面
接下来我们进入表单页面
6.8.2表单
在template里新建一个comment.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>评论</title>
</head>
<body>
<form action="/comment/" method="post">
{# 1、method="get"方法的使用方式如下:#}
{# http://127.0.0.1:8080/comment=aaa123#}
{# 2、记住!!!开发的时候 所有的表单相关的涉及到提交的#}
{# 都要用post 因为地址栏的长度是有限的 不可能把所有的东西都写在上面#}
{# 也有很多机密性的东西容易被截获 被别人看到#}
{# 所以对于表单的东西都要用post#}
<p><input type="text" name="comment"></p>
<p><input type="submit" value="评论"></p>
</form>
</body>
</html>
app.py文件:
from flask import Flask,render_template,request
import settings
app = Flask(__name__)
app.config.from_object(settings)
#所有超级链接发出的都是GET请求,地址栏上直接输入的也是GET请求
#下面点击按钮的是POST请求
@app.route('/comment/',methods=['POST','GET'])
# 如果想让POST和GET都进入来 需要开门 在app.route里设置
def comment():
print(request.method)
if request.method == 'GET':
return render_template('comment.html')
elif request.method == 'POST':
return '呵呵'
if __name__ == '__main__':
print(app.url_map)
app.run(host='0.0.0.0')