Flask框架

Flask框架

Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,
在介绍Flask之前首先来聊下它和Django的联系以及区别,django个大而全的web框架,它内置许多
模块,flask是一个小而精的轻量级框架,Django功能大而全,Flask只包含基本的配置, Django的
一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django
有模板,表单,路由,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,默认依赖
于2个外部库: Jinja2 模板引擎和 WSGI工具集--Werkzeug , flask的使用特点是基本所有的工具
使用都依赖于导入的形式去扩展,flask只保留了web开发的核心功能。
WSGI(web服务器网关接口)是python中用来规定web服务器如何与python Web服务器如何与Python
Web程序进行沟通的标准,本质上就是一个socket服务端。而 Werkzeug模块 就是WSGI一个具体的
实现
关键词:一个Python编写微web框架 一个核心两个库( Jinja2 模板引擎 和 WSGI工具集)

flask性能上基本满足一般web开发的需求, 并且灵活性以及可扩展性上要优于其他web框架, 对各种数据库的契合度都非常高

关键词

  • 性能基本满足要求
  • 灵活性可扩展性强
  • 对各种数据库的契合性度都比较高
  • 在真实生产环境下,小项目开发快,大项目设计灵活
from flask import Flask

"""
导入我们安装好的flask包,通过flask包导入Flask类,Flask类即为Flask的核心,实例化这个Flask类的到一个实例化对象app。

__name__这个特殊的参数:Python会根据所处的模块来赋予__name__变量相应的值,对于我们的程序来说(app.py),这个值为app。
"""
app = Flask(__name__)

"""
@app.route('/')就是用来匹配url的,在我们的flask里面是以装饰器来实现的,装饰器引用的也是我们上面实例化核心类出来的对象。
"""
@app.route('/')
def index():
    return 'hello flask!'

"""
app.run()实现了flask程序在开发环境下运行起来,并且默认ip和端口是127.0.0.1:5000
具体内容可以在源码run方法可以看到
"""
if __name__ == '__main__':
    app.run()

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等 。

from werkzeug.wrappers import Request, Response

@Request.application
def hello(request):
    return Response('Hello World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, hello)

flask正是依赖于这个werkzeug模块,由wekzeug模块实现了socket服务端的功能,hello必然是加括号运行了,才会执行hello里面的代码,而在我们的flask中app.run()会调用 run_simple(host, port, self, **options)把上面代码例子的hello替换成了self也就是app。app()会触发Flask类的 __call__方法。

所以所flask程序的入口就在 __call__方法中,而 __call__方法返回 self.wsgi_app(environ, start_response),所以整个程序的执行过程都在 self.wsgi_app(environ, start_response)中.

1 app.run() 调用 werkzeug.serving的run_simple(host, port, self, **options)

2 self()等价于app(), app()调用Flask类的__call__方法

3 Flask类的__call__方法返回了 self.wsgi_app(environ, start_response)

4 flask程序的执行过程都在 self.wsgi_app(environ, start_response)中

关键词

  • Werkzeug是一个WSGI工具包,本质上是一个socket服务端。
  • flask基于Werkzeug,flask只保留了web开发的核心功能。
  • flask的执行过程都在 def wsgi_app(self, environ, start_response):

app.py

from flask import Flask, request, render_template, redirect, session, jsonify

app = Flask(__name__)

app.secret_key = 'adfae^^4384045532@@#$#'
app.debug = True
USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:

        name = request.form.get('user')
        password = request.form.get('pwd')
        if name == 'lqz' and password == '123':

            session['name'] = name
            return redirect('/')
        else:
            return jsonify({'code': 101, 'msg': '用户名或密码错误'})

@app.route('/', methods=['GET'])
def index():
    if session.get('name'):
        return render_template('index.html', user_dict=USERS)
    else:

        return redirect('/login')

@app.route('/detail', methods=['GET'],endpoint='detail')
def detail():
    print(request.query_string)
    pk = int(request.args.get('pk'))
    print(pk)
    user_detail = USERS.get(pk)
    return render_template('detail.html', info=user_detail)

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

'''
0 当次请求的对象,request对象是全局的,直接导入使用即可
1 前端post提交的数据,从flask中的:request.form中取
2 转换器的使用/detail/
3 模板语法兼容django的dtl,可以直接使用函数加括号,并且可以传参数
4 session也是全局对象,用户登录信息,放到session中
5 新手四件套
    '字符串'---》HttpResonse('字符串')
    redirect('/')---》redirect('/')
    render_template()--->render()
    jsonify          ---->JsonResponse()
5 前端get请求提交的数据,从request.args
6 request.query_string是get请求 ? 后面的内容,bytes格式
7 @app.route('/detail', methods=['GET'],endpoint='detail')  endpoint等同于django路由中的name别名
'''

detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
 <h1>详细信息 {{info.name}}</h1>
    <div>
        {{info.text}}
    </div>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="登录">{{error}}
</form>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    <h1>用户列表</h1>
    <table>
        {% for k,v in user_dict.items() %}
        <tr>
            <td>{{k}}</td>
            <td>{{v.name}}</td>
            <td>{{v['name']}}</td>
            <td>{{v.get('name')}}</td>
            <td><a href="/detail/{{k}}">查看详细1</a></td>
            <td><a href="/detail?pk={{k}}&name=lqz&age=19">查看详细2</a></td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

方式一:直接写app.config['DEBUG']    一般不用
方式二:放到py文件中                  一般不用
方式三:通过环境变量                  一般不用
app.config.from_envvar("环境变量名称")
app.config.from_json("json文件名称")
JSON文件名称,必须是json格式,因为内部会执行json.loads
app.config.from_mapping({'DEBUG': True})

方式四: 通过类的方式                 用的多
app.config.from_object('settings.DevelopmentConfig')

Original: https://blog.csdn.net/prigilm/article/details/121150950
Author: 意大利面拌42号混凝土
Title: Flask框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/737187/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python趣味入门01:你真的了解Python么?

    小牛叔倾情出品,史上更简单有趣的Python入门系列教程,用认真、上心的原创带你飞。 什么入门用python,其实这和它的气质有关,根据CHM(计算机历史博物馆)网站介绍[1],V…

    Python 2023年6月12日
    071
  • python flask搭建高可用的MVC框架

    众所周知,Python的两大web框架为Django和Flask框架。Django框架大而全,而Flask是轻量级的框架,很多扩展功能需要自己写。 在开始之前,先了解一下flask…

    Python 2023年8月13日
    050
  • python面试题总结(四)

    ; Python基础 1.说一说你所知道的 Python 数据结构有哪些。 listtupledictsetstrintfloatbool 2.Python 中列表和元组的区别是什…

    Python 2023年8月1日
    049
  • Python之format格式化函数以及数字格式化输出规范

    目录 一、format函数官方解释 二、format数字格式化 format函数的应用场景,主要用于Python字符串的处理,以及计算机二级考试基础内容。 一、format函数官方…

    Python 2023年8月23日
    047
  • 【字体反爬】目标站点人人车,Python反爬系列再次更新

    📢📢📢📢📢📢💗 你正在阅读 【梦想橡皮擦】 的博客👍 阅读完毕,可以点点小手赞一下🌻 发现错误,直接评论区中指正吧📆 橡皮擦的第 661 篇原创博客 畅销专栏,打折促销中~⭐️ 《…

    Python 2023年6月3日
    0143
  • 关于Git的操作–SSH方式(学习ing)

    哎,没办法,自己整了半天的东东,想让其他跟我整了半天的同志,能看到一个详细的操作(也方便我以后自己忘记了,能来看看,哈哈),执行下面操作必须建立在有安装Git和创建了SSH key…

    Python 2023年6月9日
    063
  • 手动安装torch和torchviosn教程

    二、从github下载到了一个项目后,第一件事就是查看requirements.txt,里头的torch和torchvision的版本,,若在里头已经指定了python版本,例如p…

    Python 2023年9月28日
    060
  • Java版的NumPy – NDarray数组

    本节我们将来了解数组的一些基本属性。在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个…

    Python 2023年8月26日
    038
  • 聊聊SQL注入

    实例:模拟登录请求传入用户id和密码参数,使用字符串拼接导致的SQL注入。 拼接SQL语句,就会出现SQL注入的安全问题,拼接代码如下: String sql = "se…

    Python 2023年10月20日
    024
  • python flask 框架实现jwt用户登录 接口权限认证 案例

    环境:python3.6+ 模块:flask、jwt 目的:实现用于登录并返回token令牌,用于后续的接口权限验证。 前言介绍: jwt(JSON Web Tokens),在用户…

    Python 2023年8月9日
    045
  • 视图view的初识

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一 步骤 创建django项目 创建django应用 配置文件–settings.py 注册…

    Python 2023年8月4日
    034
  • 【机器学习】李宏毅——线性降维

    降维,可以用下面这张图来很简单的描述, 就是将不同的、复杂的多种树都抽象成最简单的树的描述,也就是我们不关心这棵树长什么样子有什么特别的特征,我们只需要降维,知道它是一棵树即可。 …

    Python 2023年10月24日
    055
  • 【小记】BatchSize的数值是设置的越大越好吗

    BatchSize的数值并不是设置的越大越好 通常我们可能会认为设置较大的batchsize时,模型的训练效果会比较好。原因有以下几点: 1、模型由于每次得到较多的训练数据,模型的…

    Python 2023年10月26日
    0102
  • Python 设计模式:适配器模式

    适配器模式是一种 结构型设计模式, 它能使接口不兼容的对象能够相互合作。通过 组合对象的方式来创建新功能。 什么是适配器 适配器帮助我们使两个不兼容的接口兼容。这到底是什么意思呢?…

    Python 2023年5月25日
    091
  • Numpy手撸softmax regression

    算法介绍 Softmax 回归(或多项逻辑回归)是将逻辑回归推广到我们想要处理多个类的情况。 在逻辑回归中,我们假设标签是二元的:y ( i ) ∈ { 0 , 1 } y^{(i…

    Python 2023年8月23日
    051
  • Django 05 :管理员操作 + 用户认证【 中间件 +图片验证码 + Cookie 与 Session】

    文章目录 1、管理员操作 * 1.1、创建表 1.2、前端基础效果 1.3、新建管理员(确定密码) 1.4、编辑 1.5、删除和重置密码 – 1.5.1、删除 1.5….

    Python 2023年8月5日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球