Erlo

flask框架基础语法

2020-11-18 22:30:16 发布   295 浏览  
页面报错/反馈
收藏 点赞

安装

pip3 install flask==0.12.5

安装好之后提供了这几个模块:

  • Jinja2:模板引擎
  • MarkupSafe:编码转换工具(字符转义)
  • Werkzeug:路由模块
  • click:事件监听系统
  • flask:本身这个类
  • itsdangerous:数据加密传输

 

创建flask项目

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

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

 

创建主程序

from flask import Flask
#创建应用对象 app
= Flask(__name__)
#视图加载 @app.route(
'/')   #声明路由,flask的路由是通过视图添加装饰器的方式进行编写的,也可以分离到另一个文件中 def index():    #声明视图函数 return 'ok'  #通过return返回普通字符串
#启动项目,不要在run后加任何代码,不会被执行 if __name__ == '__main__': app.run(debug=True,port=8000,host='0.0.0.0')
  #debug默认是Fales,改成True就是测试模式或者开发模式,改完代码会自动重启
  #port可以修改端口
  #host 绑定域名(用的较少)--请看加载配置代码

flask类代码分析

from flask import Flask

```
import_name      Flask程序所在的包(模块),传__name__可以决定,Flask在访问静态文件时查找的路径
static_path    静态文件访问路径(不推荐使用,使用 static_url_path 代替)
static_url_path     静态文件访问路径,可以不传,默认:/+static_folder
static_folder      静态文件存储的文件夹,可以不传,默认为static
template_folder    末班文件存储的文件夹,可以不传,默认为tempates

```   

加载配置

from flask import Flask

app = Flask(__name__    )

#1.1加载项目配置
class Config(object):
    DEBUG = True        ##配置项目运行在debug调试模式下
#1.2加载配置到应用对象中
app.congfig.from_object(Config)

@app.route('/')
def index():
    return 'ok'
if __name__ == '__main__':
    app.run()

 

路由的基本定义

路由:一种访问地址[url]和应用程序的[视图]进行一对一的绑定的映射关系,在开发中,我们所说的路由,通常指的是完成路由绑定关系的路由类

路由和视图的名称必须全局唯一,不能出现重复,否则报错

from flask import Flask

app = Flask(__name__)

class Config():
    DEBUG = True

app.config.from_object(Config)


@app.route(rule="/home")    #可以指定一个或者多个参数进行传递
def index(): 
    return "ok"

@app.route(rule="/home")  #路由一样则前面的执行,后面的不会执行
def index(): #函数一样则报错  error
    return "ok"if __name__ == '__main__':
    app.run() 

路由传参

#无限定类型
from flask import Flask

app = Flask(__name__    )


class Config(object):
    DEBUG = True

app.config.from_object(Config)

@app.route('/home/<user_id>')    # 没有限定参数的类型,所以user_id可以是数字,也可以是其他类型的信息(除了斜杠)
def index(user_id):
    return 'user_id=%s' %user_id


@app.route('/home/<user_id>-<mobile>')    # 传多个参数,-分开
def index1(user_id,mobile):    #这里的参数名称必须和路由上面的保持一致
    return "user_id=%s,mobile=%s" % (user_id,mobile)
if __name__ == '__main__': app.run()

#限定类型
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()

#限定路由参数的类型,flask系统自带转换器编写在werkzeug.routing.py文件中site-packages/werkzeng/routing.py


DEFAULT_CONVERTERS = {
    "default": UnicodeConverter,    #字符串类型
    "string": UnicodeConverter,     #字符串类型,上面和这个没什么区别
    "any": AnyConverter,        #任意类型
    "path": PathConverter,      #路径类型
    "int": IntegerConverter,    #整型
    "float": FloatConverter,    #浮点型
    "uuid": UUIDConverter,     #唯一通用标识符
}


自定义路由转换器
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,map,*args,**kwargs):
        # 3. regex必须有参数
        self.regex = args[0]
        super().__init__(map)

# 4. 注册
# app.url_map.converters["使用别名"] = 转换器类名
app.url_map.converters["mob"] = MobileConverter

# 路由转换器对路由参数的类型进行限定
@app.route(rule="/<mob('1[3-9]d{9 }]'):user_id>")
def index(user_id):
    print(type(user_id))  # <class 'float'>
    return "user_id=%s" % user_id

if __name__ == '__main__':
    app.run()

注册路由与视图代码进行分离

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)

http请求与响应

路由限定请求方式

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)

请求中的表单数据

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请求处理对象
    # 接受表单数据
    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']

    # 格式转换
    # ImmutableMultiDict 转换成基本格式
    # 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
    ret = request.form.to_dict() # {'username': 'xiaoming', 'password': '123456', 'lve': 'swimming'}
    
    return "ok"

if __name__ == '__main__':
    app.run(debug=True)

客服端请求的其他数据

from flask import Flask,request    #request是一个对象
from werkzeug.datastructures import ImmutableMultiDict

app = Flask(__name__)

@app.route("/query")
def get_query_params():
    """获取查询字符串 query_params"""
    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)

数据响应

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

app = Flask(__name__)

@app.route("/")
def index():
    """返回html数据"""

    # return "ok"
    # return make_response("ok") # 上面的代码是这段代码的简写
    # return Response("ok") # 上面make_response本质上就是Response

    """返回json格式数据"""
    # data = {"name":"xiaoming","age":13}
    # return jsonify(data)

    """返回其他类型数据"""
    # 关于Response常用的参数
    # Response(response="内容", status="http响应状态码",headers=自定义响应头,mimetype="数据格式")
    # return Response(response="ok",status=201,headers={"company":"hello"})
    # 返回图片信息
    with open('./1.zip',"rb") as f:
        content=f.read()
    # 判断权限,身份...
    return Response(response=content,mimetype="application/zip")

if __name__ == '__main__':
    app.run(debug=True)

重定向

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

# 跳转到站外地址
@app.route("/go")
def go():
    return redirect("http://www.luffycity.com")

if __name__ == '__main__':
    app.run(debug=True)

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认