盘点Python网页开发轻量级框架Flask知识(下篇)

Karen110
• 阅读 1344

前言

今天来给大家说一个Python的轻量级web开发框架-------Flask,为什么要推荐它呢?当然是因为它够轻量级了,开发迅速是它的特点,当然它也有缺点,不过这里不说,因为既用它又说它差感觉不好。上篇文章我们说了一半的内容,盘点Python网页开发轻量级框架Flask知识(上篇),这篇文章继续补全剩下的一半内容,一起来学习下吧~

11.request操作

这是一个专门用来操作网页请求的模块,今天我们围绕这个来具体讲解。

1)request.method

它是request中的请求方法,一般我们用的比较多的便是get和post,由于get 和post需要配合表单一起使用,在这里我们暂时不讲前端的内容,只做简单的演示。

一、get请求

可通过设置它的methods参数来指定请求方式。


@app.route('/get', methods = ['GET','POST'])
def get():
    if request.method == 'GET':
        return '这是一个GET请求'
    else:
        return '这是一个其它请求'
二、post请求

@app.route('/post', methods = ['POST','GET'])
def post():
    if request.method == 'POST':
        return '这是一个POST请求'
    else:
        return '这是一个其它请求'

2)request.args

记录get请求中的查询参数,一般用于查询,搜索网址

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=不谓侠

它会返回get请求中的参数,比如请求上面的url,它的请求参数便是:

searchType=song&searchKeyWord=不谓侠

使用方法:


request.args['keyword']
request.args.get('keyword')

3)request.form

记录请求中的表单数据,一般用于表单提交。比如我们注册网站时经常需要进行表单提交。

盘点Python网页开发轻量级框架Flask知识(下篇)

我们可以使用获取表单中的内容:


request.form['keyword']
request.form.get('keyword')

4)reuqest.values

返回请求中的参数和表单,这个用的比较少,暂不细说。

5)request.cookies

获取网页中的cookies的所有信息,也可以只获取cookies中的一个参数的值。


request.cookies['keyword']
request.cookies.get('keyword')

6)request.headers

返回请求网页头部信息,返回一个列表。


request.headers['keyword']
request.headers.get('keyword')

7)request.url、path、script_root、base_url、url_root


request.url:返回请求中的网页地址

request.path:返回网页存放地址

request.script_root:返回脚本根目录

request.base_url:返回请求相对地址

request.url_root:返回请求网页根目录

8)request.data

返回请求的数据

request.data #返回一个字节类型的值

9)request.files

文件上传必备,属于提交表单的类型,所以这是个post类型的请求方式,我们可以使用files的file字段来设置:


@app.route('/upload',methods=['GET','POST'])
def upload():
    if request.method == 'POST':
        f = request.files['file']
        filename = secure_filename(f.filename) #需要设置安全文件类型
        #f.save(os.path.join('app/static',filename))两种保存方式
        f.save('app/static/'+str(filename))
        return 'ok'
    else:
        return 'fail'

10)request.json

返回json格式的数据

11)request.environ

返回环境变量的键值

12)request.remote_addr

返回客户端的访问ip地址

13)request.host

返回host信息

12.上下文与请求钩子

1)上下文

可能大部分人对这个概念比较难以琢磨,先来说说上下文,什么是上下文?一说起上下文,我猜大家第一时间一定会想起with,想到with大家肯定会想起上下文的模块contexlib以及魔法方法enterexit,可以说,它是将复杂的事情简单化的一个神器的装饰器,我是这样理解的。那么再来看看flask的上下文。

一、应用程序上下文

它作用于flask应用中,可以用作程序实例和存储临时变量,它可分为两种:


g:处理请求时用作临时存储的对象,每次请求都会重设这个变量

current_app: 当前程序实例
二、请求上下文

顾名思义,它用于网络请求中,它也有两种。


request:请求对象
Session:存储会话

2)钩子

再来看看钩子,什么是钩子?这一点是我们先要搞清楚的,钩子其实就是在我们进行请求时,它规范了我们的请求内容和请求方式以及请求时该做什么,什么时候做,具体做哪些事,起到了一个承上启下的作用,所以,它很有用处。

一、在处理第一个请求前运行,可以用来连接数据库进行查询操作

before_first_request

二、在处理每个请求前运行,可以进行权限校验

before_request

三、在每个请求结束后自动处理返回的响应数据

after_request

四、在每个请求结束后自动异常并将异常对象作为参数传到函数中

teardown_request

五、在视图函数中注册一个函数,会在请求结束后运行

after_this_request

说完了这么多那么它们该怎么用了,接下来请看我表演:


@app.before_first_request
def first():
    print('我是第一运行的')

@app.before_request
def every():
    print('我又来了')

@app.after_request
def recv(res):
    res.headers['Content-Type']='application/json' #更改响应头部数据
    return res

@app.route('/start/<string:id>')
def start(id):
    g.use=request.cookies.get('user')
    if id==g.use:
        return request.url
    else:
        return request.cookies

ac= app.app_context() #应用上下文管理器
ac.push() #进
print(ac)
a = current_app
print(a)
ac.pop() #出
print(ac)

with app.app_context() as f:
    b= current_app
    print(b)
    print(f)

盘点Python网页开发轻量级框架Flask知识(下篇)

13.蓝图

从上面的事例我们可以看出,随着我们开发的东西越来越多,把所有东西放在一个文件里,很显然不切实际。

我们尝试着使用模块调用,于是我编写了两个Python程序,用来调用:

demo1.py

from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
    return 'hello world'
@app.route('/index')
def lk():
    return 'efhsfj'

demo2.py

from flask import Flask,request
from demo1 import *
@app.route('/')
def login():
    return request.url
if __name__ == '__main__':
    app.run(debug=True)

这里demo2是可以成功调用demo1的,但是了,它无法操作demo1的变量以及一些实例,换言之就是只能调用,无法控制改变,于是这个时候蓝图就派上用场了,那么让我们来看看吧。

demo3.py


from flask import Flask
from demo4 import root
from demo5 import admin
app=Flask(__name__) #应用实例
@app.route('/')
def lo():
    return '1111'
app.register_blueprint(root,url_prefix='/') #蓝图对象和蓝图挂载点
app.register_blueprint(root,url_prefix='/root') 
app.register_blueprint(root,url_prefix='/admin') 
app.register_blueprint(admin,url_prefix='/')
app.register_blueprint(admin,url_prefix='/admin') 
app.register_blueprint(admin,url_prefix='/root') 
if __name__ == '__main__':
    app.run(debug=True)

demo4.py

from flask import Flask,Blueprint
root=Blueprint('root',__name__) #蓝图名称和蓝图所在的模块
@root.route('/login')
def b1():
    return 'hello'
@root.route('/index')
def b2():
    return 'world'

demo5.py


from flask import Flask,Blueprint
admin=Blueprint('admin',__name__) #蓝图名称和蓝图所在的模块
@admin.route('/ff')
def bw():
    return 'ergdsfg'
@admin.route('/gg')
def be():
    return 'gtergsdf'

蓝图的精髓无非就是将多个模块引入到一个主模块中使用,相当于我们自己在写模块并把它当到蓝图中供调用。多个蓝图中如果有相同方法可用蓝图视图函数来区分各自的方法。

14.视图

一提到视图,相信大家能想到它的意思,比如mysql数据库中的视图,道理其实都是互通的,并不会有太大的差别,只是功能不一样罢了。创建视图的方式也很简单,都继承自flask的views类。

1)类视图

from flask.views import View
def ff():
    return 'ok'
class st(View):
    def dispatch_request(self): #必须实现这个方法
        return "任性的90后boy"
# 类视图通过add_url_rule方法和url做映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))
2)方法视图
from flask.views import MethodView
def gg():
    return 'ok'
class login(MethodView):
    #当客户端通过get方法进行访问的时候执行的函数
    def get(self):
        return 'get'
    # 当客户端通过post方法进行访问的时候执行的函数
    def post(self):
        email = request.form.get("user")
        password = request.form.get("pass")
        if user== 'gffsadff' and pass== '4fsaferwf':
            return "登录成功"
        else:
            return "登陆失败"

# 通过add_url_rule添加类视图和url的映射,并且在as_view方法中指定该url的名称,方便url_for函数调用
app.add_url_rule('/gg',view_func=login.as_view('lg'))

15.补充

1)全局对象

with app.test_request_context():
    print('我是第一个运行的')

看到这你应该知道它是干嘛的了吧,没错。

盘点Python网页开发轻量级框架Flask知识(下篇)

盘点Python网页开发轻量级框架Flask知识(下篇)

它是整个应用中最先启动的,可以用来做一个提醒界面啥的。

2)路由别名


@app.route('/<path:url>',endpoint='name1') #路由别名为name1
def first_flask(url): 
    print(url_for('name1',url=url)) #如果设置了url参数,url_for(别名,加参数)
    return redirect(url_for('get'))#重定向

3)添加路由规则

def fl():
    return 'ok3' 
#app.add_url_rule(rule=访问的url,endpoint=路由别名,view_func=视图名称,methods=请求方法)
app.add_url_rule(rule='/kj',endpoint='name2',view_func=fl,methods=['GET'])

4)创建路由的其它方式

无需使用装饰器的中央url映射方法,十分方便,要想实现它需创建三个文件:

myapp.py


from flask import Flask
import views
app = Flask(__name__)
@app.route('/')
def ll():
    return 'index'

@app.route('/use/<usename>')
def use(usename):
    return usename

views.py


def ll():
    return 'index'
def use(usename):
    return usename

main.py


from myapp import views
from flask import Flask
app=Flask(__name__)
app.add_url_rule('/', view_func=views.ll)
app.add_url_rule('/use/<usename>', view_func=views.use)
if __name__ == '__main__':
    app.run(debug=True)

5)常用状态码


200:请求正确
404: 路径错误
405: 请求方式错误
500: 服务器错误
302: 重定向
301 :永久重定向

16.总结

本文着重讲解了Flask的最基础的用法,Flask是一个十分优秀的web开发框架,它可以十分迅速的开发出web应用,但是它需要依赖众多的包才能完善更多的功能。

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

盘点Python网页开发轻量级框架Flask知识(下篇)

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/jzP8QDyGUAoWduvlr10I4g,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
盘点Python网页开发轻量级框架Flask知识(上篇)
前言今天来给大家说一个Python的轻量级web开发框架Flask,为什么要推荐它呢?当然是因为它够轻量级了,开发迅速是它的特点,当然它也有缺点,不过这里不说,因为既用它又说它差感觉不好。一、安装flaskpip install flask 需要注意的是,还有flake,那个是检查错误的模块,不要搞混了可以看到成功了,总共下载了四个模块,分别是对应的web开
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这