Flask学习一:概述

news2024/9/28 5:31:47

搭建项目

安装框架

pip install Flask

第一个程序

from flask import Flask

app = Flask(__name__)

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


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

怎么说呢,感觉还不错的样子。

在这里插入图片描述

调试模式

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

简单说可以理解为热重启,当你修改代码后,不需要重新启动程序。程序会自动重新进行编译。
不过网页的话,需要手动刷新一下,暂时没有看到页面内容自动更新。
在这里插入图片描述

路由

路由

@app.route('/')

表示访问项目的根URL,通过装饰器的方式还是很方便的。

变量规则
可以通过向规则参数添加可变部分来动态构建URL。

@app.route('/hello/<name>')
def hello_name(name):
    return "hello %s!" % name

在这里插入图片描述
除了默认的字符串外还支持整型、浮点数

@app.route('/blog/<int:postID>')
def show_blog(postID):
   return 'Blog Number %d' % postID

@app.route('/rev/<float:revNo>')
def revision(revNo):
   return 'Revision Number %f' % revNo

URL构建

url_for()函数对于动态构建特定函数的URL非常有用。 该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的可变部分。

个人立即应该就是重定向。

当访问者为admin时重定向到hello_admin函数,否则重定向到hello_guest函数

from flask import Flask, redirect, url_for

app = Flask(__name__)


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


@app.route('/admin')
# 用户为admin时调整到admin页面
def hello_admin():
    return 'hello admin'


@app.route('/guest/<guest>')
# 用户是访客时跳转到访客地址
def hello_guest(guest):
    return "hello guest %s" % guest


@app.route('/user/<name>')
# 是网站用户
def hello_user(name):
    if name == 'admin':
        return redirect(url_for('hello_admin'))
    else:
        return redirect(url_for('hello_guest', guest=name))


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

在这里插入图片描述

HTTP请求

flask 的http请求支持GETHEADPOSTPUTDELEATE。实际工作中基本上就是getpost是最常用的。

get:以未加密的形式将数据发送到服务器。 最常用的方法。默认的路由请求方式
post:用于将HTML表单数据发送到服务器。 POST方法接收的数据不由服务器缓存。

简单的表单提交

<html>
   <body>
      
      <form action = "http://localhost:5000/login" method = "post">
         <p>Enter Name:</p>
         <p><input type = "text" name = "nm" /></p>
         <p><input type = "submit" value = "submit" /></p>
      </form>
      
   </body>
</html>
from flask import Flask, redirect, url_for, request

app = Flask(__name__)


@app.route('/success/<name>')
def success(name):
    return "welcome %s" % name


@app.route('/login', methods=['POST', 'GET'])
def login():
    # post请求,form是固定属性
    if request.method == 'POST':
        user = request.form['nm']
        return redirect(url_for("success", name=user))
    # get请求
    else:
        user = request.args.get('nm')
        return redirect(url_for("success", name=user))


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

在这里插入图片描述

模板引擎

现在大部分的web项目都是前后端进行分离的,但是你的项目比较小的时候,就完全没有必要进行前后端分离了。那么flask如何显示前端页面呢?可以利用Flask的 Jinja2 模板引擎

加载普通页面

hello-world.html

<html>
  <body>
    <h1>你好世界</h1>
  </body>
</html>

hello.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def hello_world():
    return render_template('hello-world.html')


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

在这里插入图片描述
注意
你的html文件一定要在templates下,否则会找不到对应的页面

在这里插入图片描述
有参页面

<html>
  <body>
    <h1>你好世界</h1>
    <h2>这是参数:{{user}}</h2>
  </body>
</html>

@app.route('/<name>')
def hello_world(name):
    return render_template('hello-world.html', user=name)

注意
页面的参数与路由的参数一定要保持一致。

在这里插入图片描述

静态文件

网络应用程序通常需要一个静态文件,例如支持显示网页的 javascript 文件或 CSS 文件。 通常,网络服务器配置为为您提供服务,但在开发过程中,这些文件是从您的软件包中的 static 文件夹或模块旁边提供的

注意: 一定要有一个static文件夹

hello.html

<html>
  <head>
    <script
      type="text/javascript"
      src="{{ url_for('static', filename = 'js/hello.js') }}"
    ></script>
    <link
      rel="stylesheet"
      href="{{url_for('static',filename='css/hello.css')}}"
      type="text/css"
    />
  </head>
  <body>
    <h1>你好世界</h1>
    <h2>这是参数:{{user}}</h2>
    <button onclick="sayHello()">点击</button>
  </body>
</html>

在这里插入图片描述
在这里插入图片描述

cookie

Cookie以文本文件的形式存储在客户端的计算机上。 其目的是记住和跟踪与客户的使用相关的数据,以获得更好的访问者体验和网站统计信息。

请求对象包含Cookie的属性。 它是所有cookie变量及其对应值的字典对象,客户端已传输。 除此之外,cookie还存储其到期时间,路径和站点的域名。

设置cookie

@app.route('/setcookie', methods = ['POST', 'GET'])
def setcookie():
   if request.method == 'POST':
   user = request.form['nm']
   
   resp = make_response(render_template('readcookie.html'))
   resp.set_cookie('userID', user)
   
   return resp

在Flask中,对响应对象设置cookie。 使用 make_response()函数从视图函数的返回值获取响应对象。 之后,使用响应对象的 set_cookie()函数来存储cookie

获取cookie

@app.route('/getcookie')
def getcookie():
   name = request.cookies.get('userID')
   return '<h1>welcome '&plus;name&plus;'</h1>'

会话

Cookie不同,会话数据存储在服务器上。 会话是客户端登录到服务器并注销它的时间间隔。 需要在该会话中保存的数据存储在服务器上的临时目录中。

与每个客户端的会话都分配有会话ID 。 会话数据存储在cookie的顶部,服务器对它们进行加密签名。 对于此加密,Flask应用程序需要定义 SECRET_KEY

Session对象也是一个字典对象,包含会话变量和关联值的键值对。

设置

Session['username'] = 'admin'

释放

session.pop('username', None)

secret_key

app = Flask(__name__)
app.secret_key = 'any random string’

在Flask应用程序中,secret_key是一个重要的配置项,它被用于加密会话数据、生成安全令牌和防止跨站点请求伪造(CSRF)攻击。

以下是secret_key的作用:

  1. 会话加密:Flask使用secret_key来加密和解密会话数据,以确保会话中的敏感信息(如用户身份验证凭据)在传输过程中是安全的。如果没有设置secret_key,会话数据将无法进行加密。

  2. 安全令牌:Flask使用secret_key生成安全令牌(例如,用于重置密码的令牌)。这样,只有持有正确的secret_key的应用程序才能验证和解析这些令牌。

  3. CSRF保护:secret_key还用于生成和验证CSRF令牌。CSRF攻击是一种利用用户在其他站点上的身份验证信息执行恶意操作的攻击方式。通过使用secret_key生成CSRF令牌,Flask可以确保只有持有正确secret_key的应用程序才能验证和处理来自用户的请求,从而防止CSRF攻击。

因此,secret_key在Flask应用程序中是非常重要的配置项,必须保持安全且不泄露给其他人。

错误代码

在Flask中,abort()是一个函数,用于提前终止请求并返回指定的错误响应。它可以用于在处理请求时检测到错误或不符合条件的情况下,立即结束请求并返回相应的错误页面或错误信息。

abort()函数接受一个HTTP状态码作为参数,表示要返回的错误响应的状态码。常见的HTTP状态码包括:

  • 400:Bad Request(错误的请求)
  • 401:Unauthorized(未授权)
  • 403:Forbidden(禁止访问)
  • 404:Not Found(找不到资源)
  • 500:Internal Server Error(服务器内部错误)

以下是一个使用abort()函数返回HTTP状态码为404的示例:

from flask import Flask, abort

app = Flask(__name__)

@app.route('/')
def index():
    # 检查某些条件,如果条件不满足,终止请求并返回404错误
    if not some_condition:
        abort(404)
    return 'Hello, World!'

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

在上述示例中,如果some_condition条件不满足,请求将被终止并返回404错误响应。你可以根据需要选择适当的HTTP状态码来使用abort()函数。

在这里插入图片描述

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

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

相关文章

搭建企业社区,如何激发员工互动?

本文是关于企业内部社区搭建后怎么运营&#xff0c;如何激发员工互动。 作为运营者&#xff0c;我们搭建企业内部员工的目的首先得明确下来&#xff0c;一般都是打造和宣扬企业内部文化&#xff0c;发布公司政策通知和行业动态、组织公司关键节点活动、以及员工经验分享资源分…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边&#xff0c;则存储该图需要O&#xff08;n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想&#xff1a; 对于图的每个顶点vi&#xff0c;将所有邻接于vi的顶点链成一个单链表&#xff0c;称为顶点vi的边表&#xff08…

基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码

基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蛾群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蛾群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

2023.11.18 Hadoop之 YARN

1.简介 Apache Hadoop YARN &#xff08;Yet Another Resource Negotiator&#xff0c;另一种资源协调者&#xff09;是一种新的 Hadoop 资源管理器&#xff0c;它是一个通用资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度。支持多个数据处理框架&…

【每周一测】Java阶段三阶段考试

目录 1、SpringBoot在整合RabbitMQ时需要导入的包是 2、下列关于RabbitMQ的confirm消息确认机制解释说明正确的是 3、关于SpringBoot的配置文件&#xff0c;以下说法正确的是&#xff08;&#xff09; 4、变量命名规范说法正确的是? 5、哪个关键字可以对对象加互斥锁&…

Adversarial Attacks on Neural Networks for Graph Data

Adversarial Attacks on Neural Networks for Graph Data----《针对图数据的神经网络的对抗攻击》 论文提出了两个问题&#xff1a; 1、属性图的深度学习模型容易受攻击吗&#xff1f; 2、他们的结果可靠吗&#xff1f; 回答这两个问题需要考虑到GNN的特性&#xff1a; ①关…

Spring IOC - 推断构造方法

一、前言 上文解析了Bean生命周期的实例化阶段&#xff0c;其中bean真正开始实例化的核心代码位于方法AbstractAutowireCapableBeanFactory#createBeanInstance中&#xff0c;这里也是spring推断构造方法的核心所在。 二、整体介绍 首先看下方法的源码及注释如下&#xff0c;下…

一文带你了解QT Model/View框架的设计思想和实现机制

目录 1、QT Model/View框架简介 1.1、QT Model/View是什么&#xff1f; 1.2、QT Model/View框架核心思想 1.3、Model/View框架工作机制 1.4、Model/View框架的类 2、Model 2.1模型简介 2.2、模型索引 2.3、数据角色 2.4、QStringListModel 2.5、QFileSystemModel 2…

Pycharm中添加Python库指南

一、介绍 Pycharm是一款为Python开发者提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持执行、调试Python代码&#xff0c;并提供了许多有用的工具和功能&#xff0c;其中之一就是在Pycharm中添加Python库。 添加Python库有许多好处&#xff0c;比如能够增加开…

xlua源码分析(三)C#访问lua的映射

xlua源码分析&#xff08;三&#xff09;C#访问lua的映射 上一节我们主要分析了lua call C#的无wrap实现。同时我们在第一节里提到过&#xff0c;C#使用LuaTable类持有lua层的table&#xff0c;以及使用Action委托持有lua层的function。而在xlua的官方文档中&#xff0c;推荐使…

算法通关村第十关-青铜挑战快速排序

大家好我是苏麟,今天带来快速排序 . 快速排序 单边快速排序(lomuto 洛穆托分区方案) 单边循环 (lomuto分区) 要点 : 选择最右侧元素作为基准点j 找比基准点小的&#xff0c;i 找比基准点大的&#xff0c;一旦找到&#xff0c;二者进行交换。 交换时机: 找到小的&#xff0c…

第四篇 《随机点名答题系统》——基础设置详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.设置题库 4.1.1数据请求示意图 4.1.2选择题库&#xff08;index.php&#xff09;数据请求代码 4.1.3取消题库&#xff08;index.php&#xff09;数据请求代码 4.1.4业务处理Service&#xff08;xztk.p…

AlphaControls控件TsDBCombobox出错:访问违规

日常使用AlphaControls控件TsDBCombobox&#xff0c;作为数据变化数据的控件。通常正常使用&#xff0c;一日 发现&#xff0c;出现以下错误&#xff1a; 控件访问违规的源代码&#xff0c;出错代码&#xff1a; function TacMainWnd.CallPrevWndProc(const Handle: hwnd; co…

基于Zemax的高能激光发射系统的扩束系统设计

关键词&#xff1a;高功率激光发射系统&#xff1b;扩束系统 1 引言 高功率激光发射系统是强激光空间传输系统中不可缺少的装置。对高功率激光发射系统的研究一直是激光应用领域的关键技术问题。高功率激光发射系统通常由准直系统、导光光路系统和扩束系统组成,光学系统要求具…

股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras,Conv1D)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras) 源码设计 import quandl import datetimedf = quandl

Zabbix5.0部署

环境 主机名 IP 类型server01192.168.134.165zabbix-serverserver02 192.168.134.166zabbix-agent 官方部署文档 1 .安装yum源 [rootserver01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-rel…

分布式服务与分布式框架

分布式副武其实就是根据某个粒度&#xff0c;将服务拆分&#xff0c;而分布式框架就是将这些服务协调&#xff0c;管理起来。分布式框架&#xff0c;我认为服务调用是他的基础能力&#xff0c;该能力是所有分布式框架的基础能力&#xff0c;其次是服务注册与发现。 在这个维度…

OpenAI GPT-4 Turbo发布:开创AI新时代

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. GPT-4 Turbo的突破1.1上下文长度和控制手段的加强&#xff1a;1.2多模态支持&#xff1a…

ChatGpt3.5已经应用了一段时间,分享一些自己的使用心得.

首先ChatGpt3.5的文本生成功能十分强大&#xff0c;但是chatgpt有一些使用规范大家需要注意&#xff0c;既然chat是一种工具&#xff0c;我们就需要学会它的使用说明&#xff0c;学会chatgpt的引用语句&#xff0c;会极大的方便我们的使用。我们需要做以下的准备。 明确任务和目…

基于Vue+SpringBoot的厦门旅游电子商务预订系统 开源项目

项目编号&#xff1a; S 030 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S030&#xff0c;文末获取源码。} 项目编号&#xff1a;S030&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…