Flask-入门与视图

安装flask2

pip install flask==2.2.3

第一个Flask项目

创建helloflask.py文件,写入以下代码

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

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

run的参数:

if __name__ == '__main__':
    # 启动
    app.run(debug=True, port=5001, host='0.0.0.0')

    # run()启动的时候还可以添加参数:
    #       debug 是否开启调试模式,开启后修改过python代码会自动重启
    #       port 启动指定服务器的端口号,默认是5000
    #       host 主机,默认是127.0.0.1,指定为0.0.0.0代表本机所有ip

Flask的模板渲染

from flask import Flask, render_template, jsonify
# 模版渲染
@app.route('/index/')
def index():
    # 返回字符串:支持HTML标签
    # return '<b>Flask Index</b>'

    # 模版渲染
    return render_template('index.html', name='Jack')

#JSON
# return {'name': '张三', 'age': 33}
# 或加jsonify 序列化(字典=>字符串)
# return jsonify({'name': '张三', 'age': 33})

Flask项目拆分

在code目录新建以下目录:

FlaskPro03_项目拆分
    App
        static
        templates
        __init__.py
        models.py
        views.py
    app.py

app.py:

from App import create_app

app = create_app()

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

App/init.py

# __init__.py : 初始化文件,创建Flask应用

from flask import Flask
from .views import blue, blue2

def create_app():
    app = Flask(__name__)
    # 注册蓝图
    app.register_blueprint(blue)
    app.register_blueprint(blue2)
    return app

App/views.py

# views.py: 路由+视图函数

from flask import Blueprint
from .models import *

# 蓝图
blue = Blueprint('user', __name__)
blue2= Blueprint('product', __name__)

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

@blue2.route('/goods/')
def index():
    return 'goods'

蓝图Blueprint

1、宏伟蓝图(宏观规划)
2、蓝图也是一种规划,主要用来规划urls(路由route)
3、蓝图基本使用
	在views.py中初始化蓝图
    	blue = Blueprint('user', __name__)
	在init文件中调用蓝图进行路由注册
    	app.register_blueprint(blueprint=blue)

路由参数

route路由
路由:
将从客户端发送过来的请求分发到指定函数上
路由通过装饰器对应视图函数,并且可以接受参数,所以我们只需要在视图函数上使用装饰器即可。

# 路由参数
# string    接收任何没有斜杆(’/’)的字符串(默认)
# int       接收整型
# float     接收浮点型
# path      接收路径,可接收斜杆(‘/’)
# uuid      只接收uuid字符串,唯一码,一种生成规则
# any       可以同时指定多种路径,进行限定

# string: 重点
# @blue.route('/string/<string:name>/')
@blue.route('/string/<name>/')
def get_string(name):
    print(type(name))
    return name

# int
@blue.route('/int/<int:id>/')
def get_int(id):
    print(type(id))
    return str(id)

# float
@blue.route('/float/<float:money>/')
def get_float(money):
    print(type(money))
    return str(money)

# path: 支持/的字符串
@blue.route('/path/<path:name>/')
def get_path(name):
    print(type(name)) #<class 'str'>
    return str(name)

# uuid: 8c81dd67-31da-4031-a2b1-d5a72ea20ab1
@blue.route('/uuid/<uuid:id>/')
def get_uuid(id):
    print(type(id))  #<class 'uuid.UUID'>
    return str(id)

@blue.route('/getuuid/')
def get_uuid2():
    import uuid
    return str(uuid.uuid4())

# any: 从列出的项目中选择一个
@blue.route('/any/<any(apple, orange, banana):fruit>/')
def get_any(fruit):
    print(fruit)
    return str(fruit)

请求方法:

默认支持GET,HEAD,OPTIONS,如果想支持某一请求方式,需要自己手动指定

# methods: 请求方式
#   默认不支持POST
#   如果需要同时支持GET和POST,就设置methods
@blue.route('/methods/', methods=['GET', "POST"])
def get_methods():
    return 'methods'

methods中可以指定请求方法:
GET POST HEAD PUT DELETE

请求和响应

Request

服务器在接收到客户端的请求后,会自动创建Request对象
由Flask框架创建,Request对象不可修改

属性:
	url 完整请求地址
	base_url 去掉GET参数的URL
	host_url 只有主机和端口号的URL
	path 路由中的路径
	method 请求方法
	remote_addr 请求的客户端地址
	args GET请求参数
	form POST请求参数
	files 文件上传
	headers 请求头
	cookies 请求中的cookie
	user_agent 用户代理,包括浏览器和操作系统的信息


request.agrs:
ImmutableMultiDict类型:类字典对象,区别是可以出现重复的key
ImmutableMultiDict([('name', 'lisi'), ('name', 'wangu'), ('age', '33')])
(url: http://127.0.0.1:5000/request/?name=lisi&age=33&name=wangu)
取值:
    print(request.args['name'], request.args['age']) #只获取第一个
    print(request.args.get('name')) #只获取第一个
    print(request.args.getlist('name'))

request.form:
    print(request.form) # ImmutableMultiDict([('name', 'lucy'), ('age', '33')])
    print(request.form.get('name')) # lucy
  
request.cookies:
  	ImmutableMultiDict类型

对应的网络请求

import requests

# res = requests.get('http://127.0.0.1:5000/request/?name=lisi&age=33&name=wangu', cookies={'name':'hello'})
# print(res.text)

res = requests.post('http://127.0.0.1:5000/request/', data={'name': 'lucy', 'age': 33})
print(res.text)

Response

# Response
@blue.route('/response/')
def get_response():
    # 1、返回字符串
    # return 'hello'

    # 2、模版渲染
    # return render_template('index.html', name='jlkljkjkl')

    # 3、返回json数据
    # data = {'name':'李四', 'age':11}
    # return data
    # jsonify(): 序列化
    # return jsonify(data)

    # 4、自定义Response对象
    html = render_template('index.html', name='李四')
    # res = make_response(html, 200)
    res = Response(html)
    return res

重定向

# Redirect: 重定向
@blue.route('/redirect/')
def make_redirect():
    # 重定向的几种方式
    # return redirect('https://www.baidu.com')
    # return redirect('/response/')

    # url_for('蓝图名称.视图函数名')  反向解析,通过视图函数名反过来找到路由
    # ret = url_for('user.get_response')
    # print(ret)

    # url_for传参
    ret2 = url_for('user.get_request', name='wangwu', age= 9)
    return redirect(ret2)
posted @   Bruce_JRZ  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示