【Flask框架】

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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值