day92:flask:flask简介&基本运行&路由&HTTP请求和响应

前端之家收集整理的这篇文章主要介绍了day92:flask:flask简介&基本运行&路由&HTTP请求和响应前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目录

1.Flask简介

2.关于使用flask之前的准备

3.flask的基本运行

4.flask加载配置

5.传递路由参数(没有限定类型)

6.传递路由参数(通过路由转换器限定路由参数的类型)

7.自定义路由转换器

8.路由限定请求方式

9.注册路由和视图代码进行分离

10.flask的HTTP请求

11.flask的HTTP响应

1.Flask简介

Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。

Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-sqlAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MysqL,也可以用 Nosql

其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。

官网: https://flask.palletsprojects.com/en/1.1.x/

官方文档: http://docs.jinkan.org/docs/flask/

Flask常用第三方扩展包

  • Flask-sqlalchemy:操作数据库,ORM;

  • Flask-script:终端脚本工具,脚手架;

  • Flask-migrate:管理迁移数据库

  • Flask-Session:Session存储方式指定;

  • Flask-WTF:表单;

  • Flask-Mail:邮件

  • Flask-Bable:提供国际化和本地化支持,翻译;

  • Flask-Login:认证用户状态;

  • Flask-OpenID:认证,OAuth;

  • Flask-RESTful:开发REST API的工具;

  • Flask JSON-RPC: 开发rpc远程服务[过程]调用

  • Flask-Bootstrap:集成前端Twitter Bootstrap框架

  • Flask-Moment:本地化日期和时间

  • Flask-Admin:简单而可扩展的管理接口的框架

可以通过 https://pypi.org/search/?c=Framework+%3A%3A+Flask 查看更多flask官方推荐的扩展

2.关于使用flask之前的准备

1.为flask单独安装一套虚拟环境

mkvirtualenv flask -p python3

2.在虚拟环境中安装flask

pip install flask==0.12.5

3.创建flask项目

与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件

例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境

3.flask的基本运行

from flask import Flask

# 创建应用对象
app = Flask(__name__)

 视图加载
@app.route(rule="/")  声明路由
def index():     声明视图函数
    return <h1>python31</h1>"   直接通过return返回普通字符串

if __name__ == '__main__':
     启动项目,不要在run 后面写任何代码,不会被执行到
    app.run(debug=True,port=8000,host=0.0.0.0 wsgiref模块提供的

4.flask加载配置

 Flask

app = Flask( 配置类
class Config():
    DEBUG = True  开启调试模式

 通过app.config来加载配置
app.config.from_object(Config)


@app.route(rule=") 
def index():    
    " 


:
    app.run(port=8000,1)">")

5.传递路由参数(没有限定类型)

 Flask

app = Flask( Config():
    DEBUG = True

app.config.from_object(Config)


 路由: 一种访问地址[url]和应用程序[视图]进行一对一绑定的映射关系
# 往往在开发中,我们所说的路由,其实通常指代完成路由绑定关系的路由类
@app.route(rule=/user/<user_id>-<mobile> 可以指定一个或多个参数进行传递
def index(user_id,mobile):  这里的参数名称必须和路由上面的保持一致。
    user_id=%s,mobile=%s" % (user_id,mobile)


:
    app.run() 

6.传递路由参数(通过路由转换器限定路由参数的类型)

 True

app.config.from_object(Config)

 路由转换器对路由参数的类型进行限定
@app.route(rule=/<float:user_id>")
def index(user_id):
    print(type(user_id))   <class 'float'>
    user_id=%s user_id


:
    app.run()

7.自定义路由转换器

 自定义路由转换器 1. 声明的路由转换器类必须直接或间接继承于BaseConverter
from werkzeug.routing  BaseConverter
 MobileConverter(BaseConverter):
     2. 必须在初始化中调用父类对象进行初始化
    def __init__(self,*args,**kwargs):
         3. regex必须有参数
        self.regex = r1[3-9]\d{9}
        super().__init__(*args,1)">kwargs)

 4. 注册你自己定义的路由转换器 app.url_map.converters["使用别名"] = 转换器类名
app.url_map.converters[mob"] = MobileConverter

@app.route(rule=/<mob:user_id> user_id

:
    app.run()

8.路由限定请求方式

 路由转换器对路由参数的类型进行限定
'''@app.route(rule="/",methods=["POST","PUT","PATCH","DELETE"])'''
@app.route(rule= 没有填写第二个参数methods则默认只能通过get请求访问
 index():
    ok"

:
    app.run(debug=True)

9.注册路由和视图代码进行分离

 也可以让路由注册和视图进行分离
app.add_url_rule(rule=",view_func=index)

:
    app.run(debug=True)

10.flask的HTTP请求

文档: http://docs.jinkan.org/docs/flask/api.html#flask.request

  • request:flask中代表当前请求的 request 对象

  • 作用:在视图函数中取出本次请求数据

  • 导入from flask import request

  • 代码位置:from flask.app import Request

常用的属性如下:

属性 说明 类型
data 记录请求体的数据,并转换为字符串<br>只要是通过其他属性无法识别转换的请求体数据<br>最终都是保留到data属性 bytes类型
form 记录请求中的html表单数据 MultiDict
args 记录请求中的查询字符串,也可以是query_string MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的请求头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传文件列表 *
json 记录ajax请求的json数据 json

 

 

 

 

 

 

 

 

 

 

 

@H_404_806@1.request.form
 Flask,request
from werkzeug.datastructures  ImmutableMultiDict

app = Flask()

@app.route(/formPOSTPUTPATCH])
 get_form():
    print(request)  HTTP请求处理对象
    
     接受post提交表单数据
    print(request.form)
    """打印效果:
    ImmutableMultiDict([('username','xiaoming'),('password','123456'),('lve','swimming'),'game'),'shopping')])
    # ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。
    # 思路来源: from collection import OrderedDict
    """
    
     获取指定键的单个值
    print(request.form.get(username))
    print(request.form["])  和上面的一样,没有区别

    lve 如果键对应的数据有多个值,则不能通过get或中括号

     获取指定键获取多个值
    print(request.form.getlist("))  ['swimming','game','shopping']

     格式转换:to_dict()
     ImmutableMultiDict 转换成基本格式
     注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
    ret = request.form.to_dict()  {'username': 'xiaoming','password': '123456','lve': 'swimming'}
    
    :
    app.run(debug=True)
@H_404_806@2.request.其他
/query get_query_params():
    获取查询字符串 query_params"""
    127.0.0.1:5000/?username=xiaoming&age=18"""
    (request.args)
    print(request.args.to_dict()) 

@app.route(/head get_head():
    获取请求头数据(request.headers)
    print(request.headers[Content-Type application/x-www-form-urlencoded

     获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符]
    Company oldboyedu
    GETprint(request.method)  GET 获取本次客户端的请求方法
    print(request.url)  http://127.0.0.1:5000/  URL地址
    print(request.json)  {'pay_type': 1,'credit': 0,'coupon': 0} 获取json数据

    print(request.files)  ImmutableMultiDict([('video1',<FileStorage: 'demo.mp4' ('video/mp4')>)])
    print(request.files.get(video1:
    app.run(debug=True)

11.flask的HTTP响应

flask默认支持2种响应方式:

数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式

页面响应: 重定向

​url_for 视图之间的跳转

响应的时候,flask也支持自定义http响应状态码

@H_404_806@1.响应html文本
 index():
    返回html数据"""

    这三种形式一模一样'''
     return "<h1>hello user</h1>"
     return make_response("<h1>hello user</h1>") # 上面的代码是这段代码的简写
     return Response("<h1>hello user</h1>") # 上面make_response本质上就是Response
@H_404_806@2.响应json数据
 index():
    
    返回json格式数据 data = {"name":"xiaoming","age":13}
    return make_response(jsonify(data))
    return jsonify(data)  两种方式都可以响应json数据
@H_404_806@3.重定向redirect
 redirect
 页面跳转响应
@app.route(/user user():
     页面跳转 redirect函数就是response对象的页面跳转的封装
    return redirect(http://www.baidu.com")
@H_404_806@4.重定向到自己写的视图函数:url_for
/indexindex"


 转内跳转,进行视图之间的跳转
@app.route( home():
     视图之间的跳转
    return redirect(url_for(xiaoming))


:
    app.run(debug=True)
@H_404_806@5.自定义状态码和响应头
@app.route(/demo4 demo4():
    状态码为 666',400
  
还可以使用make_response创建Response对象,然后通过response对象返回数据"""
 make_response
@app.route(/rep index7():
    response = make_response()
    (response)
    response.headers["] = oldboy"  自定义响应头
    response.status_code = 201  自定义响应状态码
    return response

 

猜你在找的Python相关文章