基于python的web框架 Flask 入门基础知识【1】

news2024/12/23 7:14:46

        Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。

目录

一、项目环境搭配以及安装运行

1.下载安装

 2.最小的应用

3.运行应用 

4.运行结果

4.1 外部可见的服务器 

二、路由

 三、http请求

 3.1静态文件

3.2渲染模板

 3.3操作请求数据

四、文件上传

五、Cookies

5.1读取 cookies:

5.2储存 cookies:

六、重定向和错误

6.1定制出错页面

 七、关于响应response

八、会话、消息、日志及 json

8.1JSON 格式的 API

8.2会话

8.3消息闪现

8.4日志

8.5集成 WSGI 中间件


一、项目环境搭配以及安装运行

1.下载安装

pip install Flask

(venv) D:\CODE\VSCODE\python\myproject>pip install Flask

 2.最小的应用
from flask import Flask   #导入flask类 该类的实例将会成为我们的 WSGI 应用
app = Flask(__name__)     #创建一个该类的实例 第一个参数是应用模块或者包的名称

@app.route('/')           #然后我们使用 route() 装饰器来告诉 Flask 触发函数的 URL
def hello_world():        #函数名称被用于生成相关联的 URL   
    return 'Hello, World!' #返回需要在用户浏览器中显示的信息
3.运行应用 

该应用运行在windows系统中。

1.set FLASK_APP=hello.py               
2. flask run

4.运行结果

根据提示运行结果可以在 http://127.0.0.1:5000  访问

这样就启动了一个非常简单的内建的服务器。

4.1 外部可见的服务器 

运行服务器后,会发现只有你自己的电脑可以使用服务,而网络中的其他电脑却 不行。缺省设置就是这样的,因为在调试模式下该应用的用户可以执行你电脑中 的任意 Python 代码。

如果你关闭了调试器或信任你网络中的用户,那么可以让服务器被公开访问。只要在命令行上简单的加上 --host=0.0.0.0 即可:

$ flask run --host=0.0.0.0

这行代码告诉你的操作系统监听所有公开的 IP 。

二、路由

使用 route() 装饰器来把函数绑定到 URL:

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

@app.route('/hello')
def hello():
    return 'Hello, World'

还可以动态变化 URL 的某些部分, 还可以为一个函数指定多个规则。

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)

转换器类型: 

 

 三、http请求

一个路由默认回应 GET 请求。 可以使用 route()装饰器的 methods 参数来处理不同的 HTTP 方法:

from flask import Flask,request   
app = Flask(__name__) 

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()
 3.1静态文件

静态文件位于应用的 /static 中。使用特定的 'static' 端点就可以生成相应的 URL

url_for('static', filename='style.css')

 这个静态文件在文件系统中的位置应该是 static/style.css 。

3.2渲染模板

 使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
 3.3操作请求数据

对于 web 应用来说对客户端向服务器发送的数据作出响应很重要。在 Flask 中由全局 对象 request 来提供请求信息。

from flask import request

with app.test_request_context('/hello', method='POST'):
    # now you can do something with the request until the
    # end of the with block, such as basic assertions:
    assert request.path == '/hello'
    assert request.method == 'POST'
from flask import request

with app.request_context(environ):
    assert request.method == 'POST'

 通过使用 method 属性可以操作当前请求方法,通过使用 form 属性处理表单数据(在 POST 或者 PUT 请求 中传输的数据)。以下是使用上述两个属性的例子:

from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

四、文件上传

用 Flask 处理文件上传很容易,只要确保不要忘记在你的 HTML 表单中设置 enctype="multipart/form-data" 属性就可以了。否则浏览器将不会传送你的文件。

 已上传的文件被储存在内存或文件系统的临时位置。你可以通过请求对象 files 属性来访问上传的文件。每个上传的文件都储存在这个 字典型属性中。这个属性基本和标准 Python file 对象一样,另外多出一个 用于把上传文件保存到服务器的文件系统中的 save() 方法。下例展示其如何运作:

from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/uploaded_file.txt')
    ...

如果想要知道文件上传之前其在客户端系统中的名称,可以使用 filename 属性。但是请牢记这个值是 可以伪造的,永远不要信任这个值。如果想要把客户端的文件名作为服务器上的文件名, 可以通过 Werkzeug 提供的 secure_filename() 函数:

from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.filename))
    ...

五、Cookies

要访问 cookies ,可以使用 cookies 属性。可以使用响应 对象 的 set_cookie 方法来设置 cookies 。请求对象的 cookies 属性是一个包含了客户端传输的所有 cookies 的字典。在 Flask 中,如果使用 会话 ,那么就不要直接使用 cookies ,因为 会话 比较安全一些。

5.1读取 cookies:
from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.
5.2储存 cookies:
from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

六、重定向和错误

使用 redirect() 函数可以重定向。使用 abort() 可以 更早退出请求,并返回错误代码:

from flask import abort, redirect, url_for

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

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()
6.1定制出错页面

缺省情况下每种出错代码都会对应显示一个黑白的出错页面。使用 errorhandler() 装饰器可以定制出错页面:

from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

注意 render_template() 后面的 404 ,这表示页面对就的出错 代码是 404 ,即页面不存在。缺省情况下 200 表示:一切正常。

 七、关于响应response

视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字符串,那么会被 转换为一个包含作为响应体的字符串、一个 200 OK 出错代码 和一个 text/html 类型的响应对象。如果返回值是一个字典,那么会调用 jsonify() 来产生一个响应。

以下是转换的规则:

  1. 如果视图返回的是一个响应对象,那么就直接返回它。

  2. 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。

  3. 如果返回的是一个字典,那么调用 jsonify 创建一个响应对象。

  4. 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表 或字典。

  5. 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。

如果想要在视图内部掌控响应对象的结果,那么可以使用 make_response() 函数。

如下视图可以使用 make_response() 包裹返回表达式,获得响应对象,并对该对象 进行修改,然后再返回:

@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

八、会话、消息、日志及 json

8.1JSON 格式的 API

JSON 格式的响应是常见的,用 Flask 写这样的 API 是很容易上手的。如果从视图 返回一个 dict ,那么它会被转换为一个 JSON 响应。

@app.route("/me")
def me_api():
    user = get_current_user()
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }

如果 dict 还不能满足需求,还需要创建其他类型的 JSON 格式响应,可以使用 jsonify() 函数。该函数会序列化任何支持的 JSON 数据类型。

@app.route("/users")
def users_api():
    users = get_all_users()
    return jsonify([user.to_json() for user in users])
8.2会话

除了请求对象之外还有一种称为 session 的对象,允许你在不同请求 之间储存信息。这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它。

使用会话之前你必须设置一个密钥。

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

这里用到的 escape() 是用来转义的。如果不使用模板引擎就可以像上例 一样使用这个函数来转义。

如何生成一个好的密钥

生成随机数的关键在于一个好的随机种子,因此一个好的密钥应当有足够的随机性。 操作系统可以有多种方式基于密码随机生成器来生成随机数据。使用下面的命令 可以快捷的为 Flask.secret_key ( 或者 SECRET_KEY )生成值:

$ python -c 'import os; print(os.urandom(16))'
b'_5#y2L"F4Q8z\n\xec]/'

 基于 cookie 的会话的说明: Flask 会取出会话对象中的值,把值序列化后储存到 cookie 中。在打开 cookie 的情况下,如果需要查找某个值,但是这个值在请求中 没有持续储存的话,那么不会得到一个清晰的出错信息。请检查页面响应中的 cookie 的大小是否与网络浏览器所支持的大小一致。

8.3消息闪现

一个好的应用和用户接口都有良好的反馈,否则到后来用户就会讨厌这个应用。 Flask 通过闪现系统来提供了一个易用的反馈方式。闪现系统的基本工作原理是在请求结束时 记录一个消息,提供且只提供给下一个请求使用。通常通过一个布局模板来展现闪现的 消息。

flash() 用于闪现一个消息。在模板中,使用 get_flashed_messages() 来操作消息。 完整的例子参见 消息闪现 。

8.4日志
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

 logger 是一个标准的 Logger Logger 类,更多信息详见官方的 logging 文档。

8.5集成 WSGI 中间件

如果想要在应用中添加一个 WSGI 中间件,那么可以包装内部的 WSGI 应用。假设为了 解决 lighttpd 的错误,你要使用一个来自 Werkzeug 包的中间件,那么可以这样做:

from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机的核心技术!!!

无人机的核心技术涵盖了多个关键领域&#xff0c;这些技术共同支撑了无人机的稳定飞行、精准控制、高效数据传输以及多样化的应用功能。 1. 飞行控制技术 核心地位&#xff1a;飞行控制技术是无人机的核心关键技术之一&#xff0c;它确保了无人机在复杂飞行环境下的稳定性和安…

论文AI生成软件大PK!揭秘学术界的高效神器,选对了让你研究效率翻倍

在当今的学术界&#xff0c;研究与写作的压力不断攀升&#xff0c;论文的质量与数量往往成为衡量学者成就的重要指标。 然而&#xff0c;面对繁杂的研究任务和紧张的时间线&#xff0c;如何提升学术生产力成为了广大研究人员、学生及教育工作者的共同诉求。 在这样的背景下&a…

了解 JavaScript SEO

如果您是 SEO 专家&#xff0c;而不是开发人员&#xff0c;那么您可能不需要深入了解网站开发的所有复杂性。但是您确实需要了解基础知识&#xff0c;因为网站的编码方式对其性能有很大影响&#xff0c;因此对 SEO 潜力有很大影响。在关于 HTML 标签的文章中&#xff0c;我们介…

CTFHub SSRF靶场通关攻略(6-11)

FastCGI协议 首先写一个php的一句话木马&#xff0c;并进行base64编码 <?php eval($_POST[cmd]);?> 编码完成后把他写入shell.php文件中 echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8" | base64 -d > shell.php 使用Gopherus工具生成payload: 执命令 …

中国卫星影像图Level5

卫星地图&#xff0c;又称“卫星遥感图像或是卫星影像”&#xff0c;顾名思义&#xff0c;是借助卫星为媒介&#xff0c;向用户真实反馈地球地表面貌的图像。与传统意义的地图不同&#xff0c;卫星地图上看到的地表面貌是真实而实时的&#xff0c;因此&#xff0c;卫星地图的使…

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

工信部人工智能证书在哪报名?报名入口!

证书出台背景&#xff1a; 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0…

探索音视频SDK在软件集成与私有化部署中的技术难题与解决策略

随着数字化转型的加速&#xff0c;音视频通信已成为众多行业不可或缺的一部分&#xff0c;从在线教育到企业协作&#xff0c;从电商直播到远程医疗&#xff0c;音视频SDK&#xff08;软件开发工具包&#xff09;作为实现这些功能的核心技术&#xff0c;其重要性日益凸显。然而&…

Threejs制作窗户透亮效果

应该经常看到这样的图片&#xff0c;昏暗的屋里&#xff0c;阳光通过窗户照射进来&#xff0c;将照射到的地方照亮&#xff0c;没有照到的地方依然昏暗&#xff0c; Threejs提供了一种特殊的灯光用来实现上图中的效果叫RectAreaLight&#xff0c;他是一种平面光源&#xff0c;平…

私域电商平台如何去选择适合自己的商业模式!

大家好 我是一家软件开发公司的产品经理 吴军 今天我给大家讲一下如何选择合适自己平台的商业模式 以及怎么样去进行商业模式的组合 做生意&#xff0c;找到合适的商业模式就像找到一把打开成功大门的钥匙。下面是一些简单易懂的建议&#xff0c;帮助您找到最适合您平台的商…

msvcp110.dll 文件丢失怎么处理?msvcp110.dll 科学分析与解决方法

曾遇到因 "msvcp110.dll 文件丢失" 错误而无法启动应用程序的情况吗&#xff1f;这类问题通常出现在尝试打开使用 Microsoft Visual C 2012 开发的软件时。msvcp110.dll是一个属于 Microsoft Visual C Redistributable for Visual Studio 2012 的重要组件&#xff0c…

清爽舒服的蓝牙耳机有哪些?四款佩戴舒适的开放式耳机推荐

作为耳机重度患者来说&#xff0c;如果是夏天出行想要不黏腻又舒服干爽的耳机&#xff0c;那我会很推荐蓝牙耳机中的开放式耳机。 因为开放式耳机使用起来特别干爽舒服&#xff0c;‌这主要是因为它的开放式设计&#xff0c;无需入耳&#xff0c;能够让空气在耳道中自由流通&a…

超详细超实用!!!java开发之从零开始搭建项目(四)

云风网 云风笔记 云风知识库 这里采用IntelliJ IDEA编辑器以及Java平台上的Spring Boot开源框架作为接触java的基础 一、创建项目 添加Spring web依赖 项目创建成功 二、将项目添加为maven项目 Maven是一个用于构建和管理Java项目的工具&#xff0c;它提供了依赖管理、构建管…

在线考试系统应用场景分析

在线考试系统作为一种现代教育技术&#xff0c;正逐渐成为教育和培训领域的重要工具。其应用场景广泛&#xff0c;包括但不限于学校教育、企业培训、职业资格认证、在线竞赛和个人自学等。 学校教育&#xff1a;在线考试系统可以为学校提供全面的在线教育解决方案&#xff0c;…

综合在线监测装置:输电线路检测的科技魅力

传统的单一型的监控装置虽然在一定程度上能够提供实时监控功能&#xff0c;但它们往往存在一些局限性&#xff0c;特别是在电网架空输电线路的监控方面。以下是传统在线监测装置的一些不足之处&#xff0c;以及鼎信智慧科技综合型在线监测系统的优势&#xff1a; 传统视频监控…

基于ZYNQ SOC的软件无线电处理平台

板载SOC实时处理器&#xff1a;XC7Z020-2CLG484I板载2片AD9361射频收发芯片&#xff0c;兼容AD80305具有1路千兆以太网口具有1个USB串口、1个USB OTG、1个SD卡ADC/DAC采集位宽&#xff1a;12位2路TX、2路RX&#xff0c;可实现全双工或者半双工 基于Xilinx ZYNQ SOC的软件无线电…

如何处理段错误

在调试代码时&#xff0c;我们会遇到一些状况百出的问题&#xff0c;尤其是段错误&#xff0c;让人头大&#xff1a; 造成段错误的原因主要是内存泄漏&#xff0c;操作空指针&#xff1b; 在很长的代码中&#xff0c;去查找问题是很困难的&#xff0c;这里可以在Linux的ubunt…

第4章 二叉树和BST

树与二叉树 1. 基本概念 树是一种非线性结构&#xff0c;其严格的数学定义是&#xff1a;如果一组数据中除了第一个节点&#xff08;第一个节点称为根节 点&#xff0c;没有直接前驱节点&#xff09;之外&#xff0c;其余任意节点有且仅有一个直接前驱&#xff0c;有零个或多…

[报错] nvcc -V 找不到

报错&#xff1a; nvcc : 无法将“nvcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;ObjectNotFound: (nvcc:String) [], CommandNotFoundExceptionFullyQualifiedErrorId : CommandNotFoundException 找不到 nvcc -V&#xff0c;试过…

C语言基础(二十四)

堆栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;原则的数据结构。堆栈的主要操作包括压栈&#xff08;Push&#xff09;、弹栈&#xff08;Pop&#xff09;、查看栈顶元素&#xff08;Peek/Top&#xff09;等。C语言标准…