PYTHON 八月 06, 2019

第1节、Flask基础01

文章字数 12k 阅读约需 11 mins. 阅读次数 1000000

Flask框架学习的整体内容

1.Flask基础

2.模板引擎

3.flask表单

4.文件上传

5.邮件发送

6.模型(model)

7.拆分MVT

8.项目的需求分析(博客)

9.Flask项目

10.flask部署

11.flask-resful

Flask web框架分为

  1. MVC

    M: 模型 (数据的操作)

    V : 视图

    C : 控制器

  2. python中 MVT

    M: 模型 (数据的操作)

    V : 控制器

    T: 视图

    web 架构

  3. B/S

    浏览器/服务器

  4. C/S

    客户端/服务器

Flask模块

概述: flask是一个非常小的python web框架,被称为微型框架,只提供了一个强健的核心 ,其它功能都是通过第三方扩展库来实现的。

组成: 路由、模板、模型、控制器、wsgi系统、jinja2模板引擎

一、完整的运行

(1) 实例

from flask import Flask #导入Flask
app = Flask(__name__) #实例化flask类  __name__ 必传参数 当前执行的模块

#路由地址 请求当前的路由  127.0.0.1:5000
@app.route('/')
def index(): #执行请求的函数 控制器
    return 'hello flask' #响应 响应一段字符串

if __name__ == '__main__': #执行的模块 只在主程序执行
    app.run() #运行flask

(2) 路由地址

@app.route(‘/地址/‘)

def 函数名称([参数…]):

​ pass

请求地址为:

http://ip地址:端口号/地址/

(3) app.run参数

参数 参数说明
debug 是否开启调试模式 默认False 开启以后自动重新加载代码
threaded 开启多线程 默认是不开启的 True
host 主机名 默认是127.0.0.1 在其它反问的时候 127.0.0.1-127.255.255.254 本地ip 0.0.0.0本地,网络都可以请求
port 端口号 默认5000

实例:

if name == 'main': #执行的模块 只在主程序执行            
    app.run( host='0.0.0.0',port=5001,debug=True,threaded=True) #运行flask

http://10.0.121.138:5001/
http://127.0.0.1:5001/

二、视图函数

(1) 无参路由

@app.route('/')
def index():
    pass

(2) 带一个参数的路由

#传递一个参数的路由
@app.route('/args/<page>/')
def args(page):
    print(type(page))
    return 'page的值为{}'.format(page)

注意: 路由值都为字符串类型

(3) 传递多个参数

#传递多个参数 类型1:
#http://127.0.0.1:5000/manyarg/1/2/
@app.route('/manyarg/<arg1>/<arg2>/')
def manyArg(arg1,arg2):
    print(type(arg1),type(arg2))
    return 'arg1的值为{} arg2的值为{}'.format(arg1,arg2)

#传递多个参数 类型2:
#http://127.0.0.1:5000/manyarg/1_2/
@app.route('/manyarg/<arg1>_<arg2>/')
def manyArg(arg1,arg2):
    print(type(arg1),type(arg2))
    return 'arg1的值为{} arg2的值为{}'.format(arg1,arg2)
#运行结果:arg1的值为1 arg2的值为2

(4) 限制参数的类型

  1. int
  2. string
  3. path
  4. float
    @app.route('/argtype/<int:arg>/') #只能传递整形
    @app.route('/argtype/<string:arg>/') #字符串  默认就是字符串
    @app.route('/argtype/<path:arg>/') #路径 将/不再认为是分隔符 而是值的一部分 其实也是字符串类型
    @app.route('/argtype/<float:arg>/') #浮点形
    def argType(arg):
     print(type(arg))
     print(arg)
     return '参数类型'

注意:

  1. 路由地址末尾的‘/’ 建议都加上,如果在访问需要‘/’的路由的时候没有添加‘/’的话,浏览器会自动添加上‘/’
  2. 参数写在<>内,<>内的参数和前面的路由地址构造出一个全新的路由地址
  3. 参数类型默认为 string

三、响应 response

(1) 指定响应的状态码

实例

@app.route('/')
def index():
    return '值',404  #code状态码 必须是标准库中的

(2) 通过make_response 构造响应(make_response)

#make_response 构造响应
@app.route('/response/')
def res():
    # response = make_response('make_response构造响应')
    response = make_response('make_response构造响应',500) #将响应的状态码 设置为 500
    return response

四、重定向( url_for,redirect)

(1) redirect 的使用

redirect不带参数的跳转

@app.route('/')
def index():
    return 'index'

@app.route('/login/')
def login():
    return redirect('/') #参数为跳转的路由地址

redirect带参数的跳转

@app.route('/test/<arg1>/<arg2>/')
def test(arg1,arg2):
    return 'test'

@app.route('/login/')
def login():
    return redirect('/test/1/2/') #参数为跳转的路由地址

(2) url_for 根据 视图函数名称 反向构造出路由地址

@app.route('/'):
    #不带参数
    return url_for('index') # /
    return url_for('indexx') #当前indexx视图函数不存在  
    #Could not build url for endpoint 'indexx'. Did you mean 'index' instead?
    #带参数
    return url_for('test',arg1=1,arg2=2) # /test/1/2/
    return url_for('test',arg1=1,arg2=2) 
# 如果 arg1和arg2是路由地址的参数 则拼凑的地址为 /test/1/2/  如果不是则 /test/?arg1=1&arg2=2

(3) redirect和url_for的组合重定向

@app.route('/test/')
def test():
    return redirect(url_for('index')) # 跳转到 首页视图 /

注意: 如果视图函数不存在则会报错

HTTP状态码所代表的含义

  1. 消息
  2. 成功
  3. 重定向
  4. 请求错误
  5. 服务器错误

五、abort 抛出http标准状态码中的错误(abort)

@app.route('/test/')
def test2():
    print('404')
    abort(404)

注意: 类似raise 上面的代码正常执行 下面代码不再执行

捕获http状态码的错误

#捕获404状态码的错误 
@app.errorhandler(404)
def page_not_found(e): #e为错误的信息
    return '404-------{}'.format(e)

六、请求(request)

作用:
获取用户请求所带的数据

概述:

  1. 浏览器发送到服务器的所有请求被flask接收以后,创建出request对象,request对象用在视图函数中,用于获取请求的数据
  2. request对象由flask创建,想要获取请求数据,直接导入模块即可

request属性:

  1. url 获取完整请求的url地址

    print('获取完整请求的url地址',request.url)
  2. base_url 去掉get传参的url

    print('去掉get传参的url',request.base_url)
  3. host_url 只有主机地址和端口号

    print(' 只有主机地址和端口号',request.host_url)
  4. path 请求的路由地址

    print('请求的路由地址',request.path)
  5. method 请求的方法

    print('请求的方法',request.method)
  6. args 请求的get传参

    print(' 请求的get传参',request.args)
    print(' 请求的get传参',request.args['name'])#当返回的args中不存在name时报错
    print(' 请求的get传参',request.args.get('name')) #当返回的args中不存在name时不报错
    print(' 请求的get传参',request.args.getlist('name'))#args存在多个name时,该方法返回所有的name对应的值--列表
  7. form 获取表单post传递过来的数据

    print('获取完整请求的url地址',request.form)
  8. files 文件上传

    print('获取完整请求的url地址',request.files)
  9. headers 获取请求的头信息 想要获取哪个 使用request.headers.get(key)进行获取

    print('请求头信息',request.headers.get('User-Agent'))
    print('请求头信息',request.headers.get('Host'))
  10. cookies 获取cookie

    print('获取请求过来的cookie',request.cookies)
    print('获取请求过来的cookie',request.cookies.get('sessionid'))
  11. json 获取请求过来的json数据

    print('获取请求过来的json数据',request.json)

实例

@app.route('/')
def index():
    print('获取完整请求的url地址',request.url)
    print('去掉get传参的url',request.base_url)
    print(' 只有主机地址和端口号',request.host_url)
    print('请求的路由地址',request.path)
    print('请求的方法',request.method)
    print('请求的get传参',request.args)
    print('请求的get传参',request.args['name'])
    print('请求的get传参',request.args.get('name'))
    print('请求的get传参',request.args.getlist('name'))
    print('请求的get传参',request.args['age'])
    print('请求的get传参',request.args.get('age'))
    print(' 获取表单post传递过来的数据',request.form)
    print('获取文件上传',request.files)
    print('请求头信息',request.headers.get('User-Agent'))
    print('请求头信息',request.headers.get('Host'))
    print('获取请求过来的cookie',request.cookies)
    print('获取请求过来的cookie',request.cookies.get('sessionid'))
    print('获取请求过来的json数据',request.json)
    return 'index'

上一篇:
下一篇:
0%