目录

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加载配置

from flask import Flask

app = Flask(__name__)

# 配置类
class Config():
DEBUG = True # 开启调试模式 # 通过app.config来加载配置
app.config.from_object(Config) @app.route(rule="/")
def index():
return "<h1>python31</h1>" if __name__ == '__main__':
app.run(port=8000,host="0.0.0.0")

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

from flask import Flask

app = Flask(__name__)

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

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

from flask import Flask

app = Flask(__name__)

class Config():
DEBUG = True app.config.from_object(Config) # 路由转换器对路由参数的类型进行限定
@app.route(rule="/<float:user_id>")
def index(user_id):
print(type(user_id)) # <class 'float'>
return "user_id=%s" % user_id if __name__ == '__main__':
app.run()

7.自定义路由转换器

from flask import Flask

app = Flask(__name__)

class Config():
DEBUG = True app.config.from_object(Config) # 自定义路由转换器
# 1. 声明的路由转换器类必须直接或间接继承于BaseConverter
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
# 2. 必须在初始化中调用父类对象进行初始化
def __init__(self,*args,**kwargs):
# 3. regex必须有参数
self.regex = r"1[3-9]\d{9}"
super().__init__(*args,**kwargs) # 4. 注册你自己定义的路由转换器
# app.url_map.converters["使用别名"] = 转换器类名
app.url_map.converters["mob"] = MobileConverter @app.route(rule="/<mob:user_id>")
def index(user_id):
print(type(user_id)) # <class 'float'>
return "user_id=%s" % user_id if __name__ == '__main__':
app.run()

8.路由限定请求方式

from flask import Flask

app = Flask(__name__)

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

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

from flask import Flask

app = Flask(__name__)

def index():
return "ok" # 也可以让路由注册和视图进行分离
app.add_url_rule(rule="/",view_func=index) if __name__ == '__main__':
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

 

1.request.form

from flask import Flask,request
from werkzeug.datastructures import ImmutableMultiDict app = Flask(__name__) @app.route("/form",methods=["POST","PUT","PATCH"])
def get_form():
print(request) # HTTP请求处理对象 # 接受post提交表单数据
print(request.form)
"""打印效果:
ImmutableMultiDict([('username', 'xiaoming'), ('password', '123456'), ('lve', 'swimming'), ('lve', 'game'), ('lve', 'shopping')])
# ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。
# 思路来源: from collection import OrderedDict
""" # 获取指定键的单个值
print(request.form.get("username"))
print(request.form["username"]) # 和上面的一样,没有区别 print(request.form["lve"]) # 如果键对应的数据有多个值,则不能通过get或中括号 # 获取指定键获取多个值
print(request.form.getlist("lve")) # ['swimming', 'game', 'shopping'] # 格式转换:to_dict()
# ImmutableMultiDict 转换成基本格式
# 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
ret = request.form.to_dict() # {'username': 'xiaoming', 'password': '123456', 'lve': 'swimming'} return "ok" if __name__ == '__main__':
app.run(debug=True)

2.request.其他

from flask import Flask,request
from werkzeug.datastructures import ImmutableMultiDict app = Flask(__name__) @app.route("/query")
def get_query_params():
"""获取查询字符串 query_params"""
"""127.0.0.1:5000/?username=xiaoming&age=18"""
print(request.args)
"""打印效果:
ImmutableMultiDict([('username', 'xiaoming'), ('age', '18')])
"""
print(request.args.to_dict()) # {'username': 'xiaoming', 'age': '18'}
return "ok" @app.route("/head")
def get_head():
"""获取请求头数据"""
print(request.headers)
print(request.headers["Content-Type"]) # application/x-www-form-urlencoded # 获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符]
print(request.headers["Company"]) # oldboyedu
return "ok" @app.route("/",methods=["POST","GET"])
def index():
print(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"))
return "ok" if __name__ == '__main__':
app.run(debug=True)

11.flask的HTTP响应

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

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

页面响应: 重定向

​url_for 视图之间的跳转

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

1.响应html文本

from flask import Flask,request,make_response,Response,jsonify

app = Flask(__name__)

@app.route("/")
def index():
"""返回html数据""" '''这三种形式一模一样'''
# return "<h1>hello user</h1>"
# return make_response("<h1>hello user</h1>") # 上面的代码是这段代码的简写
# return Response("<h1>hello user</h1>") # 上面make_response本质上就是Response

2.响应json数据

from flask import Flask,request,make_response,Response,jsonify

app = Flask(__name__)

@app.route("/")
def index(): """返回json格式数据"""
# data = {"name":"xiaoming","age":13}
return make_response(jsonify(data))
return jsonify(data) # 两种方式都可以响应json数据

3.重定向redirect

from flask import redirect
# 页面跳转响应
@app.route("/user")
def user():
# 页面跳转 redirect函数就是response对象的页面跳转的封装
return redirect("http://www.baidu.com")

4.重定向到自己写的视图函数:url_for

from flask import Flask,redirect,url_for

app = Flask(__name__)

@app.route("/index")
def index():
return "index" # 转内跳转,进行视图之间的跳转
@app.route("/")
def home():
# 视图之间的跳转
return redirect(url_for("index",name="xiaoming")) if __name__ == '__main__':
app.run(debug=True)

5.自定义状态码和响应头

@app.route('/demo4')
def demo4():
return '状态码为 666', 400 """还可以使用make_response创建Response对象,然后通过response对象返回数据"""
from flask import make_response
@app.route("/rep")
def index7():
response = make_response("ok")
print(response)
response.headers["Company"] = "oldboy" # 自定义响应头
response.status_code = 201 # 自定义响应状态码
return response

day92:flask:flask简介&基本运行&路由&HTTP请求和响应的更多相关文章

  1. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  2. Flask(1):基本示例、配置文件、路由、请求和响应、模板渲染

    Flask的特点: - pip install flask - 短小精悍.可扩展性强的 web框架 注意:上下文管理机制 - 依赖 wsgi:werkzeug Flask的简单示例: from fla ...

  3. Flask 基础组件(五):请求和响应

    from flask import Flask from flask import request from flask import render_template from flask impor ...

  4. Flask (一) 简介

    Flask简介 Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework' Django是一个重型框架 官方文档: http://flask.pocoo.org/do ...

  5. Flask - 四剑客 | templates | 配置文件 | 路由系统 | CBV

    Flask框架简介 说明:flask是一个轻量级的web框架,被称为微型框架.只提供了一个高效稳定的核心,其它全部通过扩展来实现.意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩 ...

  6. Inside Flask - Flask 简介

    Inside Flask - Flask 简介 前言 Flask 的设计目标是实现一个 wsgi 的微框架,其核心代码保持简单和可扩展性,很容易学习.对于有一定经验初学者而言,跟着例子和一些书的代码来 ...

  7. Python框架学习之Flask中的视图及路由

    在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...

  8. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  9. Flask 学习(二)路由

    Flask  路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” from flask imp ...

随机推荐

  1. 【思维】UVA 11300 Spreading the Wealth

    题目大意 vjudge链接 有n个人围圆桌而坐,每个人有Ai个金币,每个人可以给左右相邻的人一些金币. 若使得最终所有人金币数相等,求最小金币转移数. 数据范围 n<1000001 样例输入 3 ...

  2. Convert to Ones CodeForces(超水题)

    题目大意:给你几个数,这些数里面只有0或1,你有两种操作:1.把一段区域内的所有数前后交换位置.2.把一段区域内所有数取反.(区域可大可小,可以是所有数也                       ...

  3. 用node.js给C#写一个数据表的实体类生成工具

    虽然微软提供了T4模板,但是我感觉非常难用.哪儿比得上直接用脚本来写模板来的爽. 因为要给一个老项目做周边的工具,需要连接到数据库. 我习惯性用EntityFrameworkCore来做,因为毕竟从出 ...

  4. linux mount 挂载提示 mount: you must specify the filesystem type

    解决方法: mkfs.ext3 /dev/vdv mount -t ext3 /dev/vdv /usr1

  5. 实战二:nacos服务注册与发现,openfeign服务调用

    一,参照上一篇创建好微服务结构后,按业务需求编写各微服务逻辑 二,服务注册 1,安装nacos:下载,解压,运行startup.cmd 2,访问 http://localhost:8848/nacos ...

  6. vue 用别名取代路径引用

    在项目开发过程中有可能很多包是没有放在npm上的,许多包需要下载到本地引用,这样一来我们只能通过require的方式来引用文件,但是路径的名字就会很长 例如 import Select from '. ...

  7. 常用物联网应用层协议(1)——先说HTTP协议

    概念 简介 HTTP是一个属于应用层的面向对象的协议,目前使用最为广泛的是HTTP1.1协议.当然,许多网站已经开始支持HTTP2.0,HTTP2复杂度高于HTTP1.1,我们先从HTTP1.1说起. ...

  8. Java8新特性探索之函数式接口

    一.为什么引入函数式接口 作为Java函数式编程爱好者,我们都知道方法引用和 Lambda 表达式都必须被赋值,同时赋值需要类型信息才能使编译器保证类型的正确性. 我们先看一个Lambda代码示例: ...

  9. 在阿里云Ubuntu 14.04.5 LTS下安装nethogs0.8.5

    由于默认安装的nethogs不能使用,提示:Creating socket failed while establishing local IP - are you root? 搜索资料后检查当前版本 ...

  10. CodeForces 1420E Battle Lemmings

    题意 略. \(\texttt{Data Range:}1\leq n\leq 80\) 题解 首先考虑初始状态怎么算答案.很明显直接数满足的不好数,用总的减去不满足的还比较好做.注意到所有不满足的是 ...