python--flask框架基础知识

本文介绍了如何使用Flask创建第一个应用,配置参数,定义路由,获取请求参数,返回响应,以及使用Blueprint实现模块化开发。还涵盖了Cookie与Session,请求钩子,上下文管理和Flask-Script的扩展。

1. 第一个 flask 程序

"""
1.导入flask 类
2. 创建app对象
3.自定义视图函数,使用装饰器路由和视图函数绑定
4.使用app对象运行flask项目
"""

from flask import Flask

app = Flask(__name__)


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

if __name__ == '__main__':
    print(app.url_map)     # 用于查询 url 路由路径--全部信息
    app.run()     # http://127.0.0.1:5000/  默认端口:5000

2. 程序加载配置

在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:

  • 从配置对象中加载(常用)
    • app.config.from_object()
  • 从配置文件中加载
    • app.config.from_pyfile()
  • 从环境变量中加载(了解)
    • app.config.from_envvar()
## 从配置对象中加载,创建配置的类 ##<只介绍第一种>
# 配置对象,里面定义需要给 APP 添加的一系列配置
class Config(object):
    DEBUG = True


# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)

# 从配置对象中加载配置
app.config.from_object(Config)

读取配置:

  • app.config.get()
  • 在视图函数中使用 current_app.config.get()

注:Flask 应用程序将一些常用的配置设置成了应用程序对象的属性,也可以通过属性直接设置/获取某些配置:app.debug = True

app.run的参数

  • 可以指定运行的主机IP地址,端口,是否开启调试模式

app.run(host="0.0.0.0", port=5000, debug = True)

3. 路由基本定义

    修改@app.route()的参数达到修改访问url:
    目的:不同的url引导到对应的视图函数

     1. 指定路由地址:

# 指定访问路径为 demo1
@app.route('/demo1')
def demo1():
    return 'demo1'

      2. 给路由传参示例

# 路由传递参数 -- 尖括号里面代表传递的参数
(url:http://127.0.0.1:5000/user/zhangsan)

@app.route('/user/<user_id>')
def user_info(user_id):
    return 'hello %s' % user_id

# 指定参数的类型
@app.route('/user/<int:user_id>')
def user_info(user_id):
    return 'hello %d' % user_id

# 指定请求方法 -- 注意:methods是一个列表。请求方法大小写均可。
@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
    # 直接从请求中取到请求方式并返回
    return request.method

4. 获取请求参数

  • request:flask中代表当前请求的 request 对象
  • 作用:在视图函数中取出本次请求数据
  • 导入from flask import request

常用的属性如下:

属性说明类型

data

request.json

request.get_json()

记录请求的数据,并转换为字符串

记录json 数据 -- post请求(字典)

*

dict

form记录请求中的表单数据-- post请求(表单数据)MultiDict

args

values

记录请求中的查询参数 -- get 请求参数MultiDict
cookies记录请求中的cookie信息Dict
headers记录请求中的报文头EnvironHeaders
method记录请求使用的HTTP方法GET/POST
url记录请求的URL地址string
files记录请求上传的文件*
# 指定访问路径为 demo1
@app.route('/demo1')
def demo1():
    a = request.args.get('a')
    return 'demo1 %s' % a


获取请求中查询字符串
 url:  http://127.0.0.1:5000/demo1?a=10

flask 获取GET和POST请求参数(全)_冰__蓝的博客-CSDN博客_flask获取post参数

5. 返回响应

 当需要给客户端返回json类型的数据的时候,可以借助jsonify函数将python字典转换成json字符串(序列化)
语法格式:
    jsonify(字典)
作用:
    1.将字典转换成json字符串
    2.将返回值包装成resonse对象
    3.将数据类型设置成application/json格式

    扩展:  序列化:将python对象转换成json对象
            方法一:json_response = jsonify(my_dict)
            方法二:json_str = json.dumps(my_dict)

           反序列化:将json字符串数据转换成python对象
                   json.loads(json_str)

重定向
    概念:当你访问某一url路由的时候,不是给你引导到当前url对应的网页而是跳转到了另一个url对应的网页。
重定向语法:
    redirect(url地址)
拓展:
    1.一般先通过反向解析函数获取某一视图函数对应的url:url_for(视图函数名称,函数参数)
    2.然后再使用redirect(url)进行重定向


 状态码返回:  302 重定向
                      405 服务器请求错误

6. Cookie 与 Session

cookie作用
    状态保持,以键值对方式保存用户信息到`浏览器`。
    
特点:
    1.Cookie是由服务器端生成,发送给客户端浏览器。
    2.浏览器会将Cookie的key/value保存。
    3.下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)
    4.Cookie基于域名安全,不同域名的Cookie是不能互相访问的

1.设置cookie:
 response.set_cookie(key, value, max_age=过期时长)
2.获取cookie:
 request.cookies.get(key, "")
3.删除cookie:
 response.delete_cookie(key)

from flask import request, make_response, session

# cookie 的设置
@app.route("/login")
def set_cookie():
    # 登陆成功,借助cookie 保存用户登陆信息
    #1. 初始化响应对象,将字符串通过 make_response方法包装成响应对象
    response = make_response("set cookie success")
    #2. 借助响应对象,设置cookie键值对信息
    response.set_cookie("username", "zhangsan", max_age=3600)
    # 返回响应对象
    return response
    # return "set cookie success"

Session作用:
    状态保持,以键值对方式保存用户信息到`服务器`。

特点:
    1.在服务器端进行状态保持的方案就是Session
    2.以字典的方式将数据保存到服务器端。
    3.Session依赖于Cookie。(最终会返回session_id,需要借助cookie告知浏览器)

1.设置session:
 session["key"] = "value"
2.获取Session:
 session.get("key", "")
3.删除Session:
 session.pop("key", "")
注意点:使用session的时候要设置secret_key加密字符串,到时候session_id需要进行混淆加密处理;

 可以在 app.config 配置类中设置;
  或者直接      app.secret_key ="djfsjdfklj"

7. 请求勾子

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request
    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request:
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
from flask import Flask
from flask import abort

app = Flask(__name__)


# 在第一次请求之前调用,可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
    print("before_first_request")


# 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
# 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
    print("before_request")
    # if 请求不符合条件:
    #     return "laowang"


# 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
    print("after_request")
    response.headers["Content-Type"] = "application/json"
    return response


# 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(e):
    print("teardown_request")


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

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


==========================
在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request
==========================
在第2次请求时的打印:
before_request
after_request
teardown_request

7. 上下文概念与Flask-Script扩展

上下文定义:
根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。

Flask中有两种上下文:

from flask import Flask, request, session, current_app, g

1.请求上下文: request,session
2.应用上下文: current_app(app的别名),g(全局的一个临时变量)
注意:不同的请求,会有不同的g对象全局变量,超出请求超出范围不能使用

Flask-Script:

作用:通过命令行的方式传入参数,启动Flask服务器,取代app.run()动态指明ip和端口。

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
# 把 Manager 类和应用程序实例进行关联
manager = Manager(app)

@app.route('/')
def index():
    return '床前明月光'

if __name__ == "__main__":
    manager.run()

集成 Flask-Script步骤:
    1.将app对象使用管理起来:
        manager = Manager(app)
    2.使用manager启动项目:
        manager.run()

命令:(本地pycharm 配置在 Paramenters 参数里)
    python 文件名称 runserver -h 127.0.0.1  -p 5000   -d
                              指明ip地址    指明端口号  开启debug模式

8. Blueprint

      blueprint蓝图作用:分模块开发

蓝图的基本使用:

1.导入蓝图类

2.创建蓝图对象

3.使用蓝图对象装饰视图函数

4.将蓝图对象注册到app上

app作用: 整个项目

蓝图作用:整个模块

缺点:如果在应用创建后,你撤销注册一个蓝图,那么就必须销毁整个应用对象。

============= admin.py 文件 ======================
# 导入蓝图类
from flask import Blueprint

# 创建蓝图对象。
# 参数1:蓝图名称    参数2:__name__
admin_bule=Blueprint('admin_blue',__name__)

# 使用蓝图对象装饰视图函数
@admin_bule.route('/admin_url')
def admin_home():
    return 'admin_home'

============ profile.py 文件 =====================
# 导入蓝图类
from flask import Blueprint

# 创建蓝图对象。
# 参数1:蓝图名称    参数2:__name__
profile_bp = Blueprint("profiles", __name__)

# 使用蓝图对象装饰视图函数
@profile_bp.route('/profile/info')
def profile():
    return "profile"



============= app.py 文件 ========================
# 导入蓝图对象
from admin import admin_bule
from profile import profile_bp
from flask import Flask

app = Flask(__name__)

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

# 在应用对象上注册这个蓝图对象
# 注册蓝图使用 register_blueprint 方法 ,url_prefix表示访问此蓝图的 url 前缀;
# 默认为:/
app.register_blueprint(admin_bule,url_prefix='/admin')
app.register_blueprint(profile_bp)

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

===========================
请求url:  http://127.0.0.1:5000/admin/admin_url
          http://127.0.0.1:5000/profile/info
          http://127.0.0.1:5000/
          

blueprint蓝图(目录结构)

总结:
    web开发都需要分模块开发,每一个模块就是一个单独的目录。
    
实现蓝图目录结构步骤:
    1.模块的__init__.py文件中创建 `蓝图对象`。
    2.views.py文件使用蓝图对象装饰视图函数。
    3.在回到__init__.py文件中导入views文件中内容,与模块产生关联。
    4.调用app的register_blueprint方法注册蓝图

循环导入问题:
    解决方案:延迟导入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值