当前位置: 首页 > news >正文

Python光速入门 - Flask轻量级框架

        FlASK是一个轻量级的WSGI Web应用程序框架,Flask的核心包括Werkzeug工具箱和Jinja2模板引擎,它没有默认使用的数据库或窗体验证工具,这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单,同时提供强大的扩展性,用户可以通过添加各种扩展来增加功能,如邮件发送、用户认证、数据库集成等
        然后需要嘱咐的一个事情,一定要注意代码格式,Tab制表符和空格一定要区分开

        pip升级命令:python -m pip install --upgrade pip

FlASK框架安装:

1.软件版本

Flask要求Python的版本在3.4以上

2.创建一个工作目录

my_python_flask(使用makdir命令)

3.创建虚拟环境

python -m venv myenv

4.安装flask框架

pip install flask其他包:


pip install flask-login
pip install flask-openid
pip install flask-mail :为Flask应用程序提供SMTP接口
pip install flask-sqlalchemy :将SQLAlchemy支持添加到Flask应用程序中
pip install flask-mysqldb : 支持数据库操作
pip install mysql-connector-python
pip install flask-whooshalchemy
pip install flask-wtf :添加了WTForms的渲染和验证
pip install flask-babel
pip install guess_language
pip install flipflop
pip install Sijax :使AJAX易于在Web应用程序中使用Python/jQuery库

 

5.运行.bat文件

        

6.检查安装是否成功

pip freeze

相关依赖解释:

依赖名称

依赖作用

Werkzeug

用于实现WGGI,应用和服务之间的标准Python接口

Jinja

用于渲染页面的模板语言

MarkupSafe 与Jinja共用

在渲染页面时用于避免不可信的输入,防止注入攻击

ItsDangerous

保证数据完整性的安全标志数据,用于保护Flask的session cookie

Click

一个命令行应用的框架,用于提供flask命令,并允许添加自定义管理命令

FlASK框架使用:

1.代码:

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'

2.FLASK_APP环境变量

set FLASK_APP=flaskone/main/index.py

3.启动命令

python -m flask run

4.运行结果:

调试模式:

命令:

set FLASK_ENV=development

flask run --host=0.0.0.0

路由参数以及路由参数强制转换

@app.route('/user/<username>')

转换器类型

使用

string字符串类型

< string:name >

int整数类型

< int:name >

float小数类型

< float:name >

path路径类型

< path:name >

代码:

from flask import Flask
app = Flask(__name__)@app.route('/hello_world/<int:age>')
def hello_world(age):return "获取的年龄是:%s" % age

运行结果:

Flask URL构建 + 重定向

代码:

from flask import Flask,redirect,url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():return 'Hello Admin'
@app.route('/guest/<guest>')
def hello_guest(guest):return 'Hello %s as Guest' % guest
@app.route('/user/<name>')
def 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://127.0.0.1:5000/user/admin
浏览器输出地址:http://127.0.0.1:5000/admin

浏览器访问地址:http://127.0.0.1:5000/user/home
浏览器输出地址:http://127.0.0.1:5000/guest/home

结合代码看,发现了问题所在没有?

        1.重定向的标准函数是:redirect
        2.定义的函数user,这个函数很说明问题,以后的代码延伸就是靠这个url_for方法来实现的,至于到底有什么用,相信有经验的开发者已经看出了,这个方法可以作为一个中间件使用,这点非常重要,一定要重视

HTTP请求

        在PHP、Golang、Python等等语言中,常用请求的方式无非有以下几种,这个可以结合前面的url_for来实现Restful风格接口

编号方法描述
1GET将数据以未加密的形式发送到服务器,这最常用的方法。
2HEAD与GET相同,但没有响应主体
3POST用于将HTML表单数据发送到服务器。通过POST方法接收的数据不会被服务器缓存。
4PUT用上传的内容替换目标资源的所有当前表示。
5DELETE删除由URL给出的所有目标资源的所有表示

使用方法,定义路由的时候可以定义HTTP请求方法

from flask import Flask,redirect,url_for
app = Flask(__name__)
@app.route('/test',methods=['GET','POST','HEAD','PUT','DELETE'])
def test():return 'echo test'

数据接收:

3.0及以上版本使用

data = request.form.to_dict()
name = data.get('name')
age = data.get('age')

3.0以下版本使用

age = request.agrs.get("age","21")

from flask import Flask, request
app = Flask(__name__)
@app.route("/agrs",methods=['POST'])
def agrs():data = request.form.to_dict()sex = data.get("sex")name = data.get("name")return f"姓名:{name}  性别:{sex}"
if __name__ == '__main__':app.run()

Flask 模板(模板引擎)

        Jinja2通过render_template()函数渲染HTML文件, Web模板包含用于变量和表达式(这些情况下为Python表达式)的HTML语法散布占位符,这些变量和表达式在模板呈现时被替换为值,模板引擎使用以下分隔符来从HTML转义

{% ... %} 用于多行语句
{{ ... }} 用于将表达式打印输出到模板
{# ... #} 用于未包含在模板输出中的注释
# ... ## 用于单行语句

注意:路径示例(.py文件夹和templates一定要在同一级)

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/test')
def test():dic = {"firts":1,"second":2,"thired":3}return render_template('test.html',result=dic)
if __name__ == '__main__':app.run(debug = True)
<!DOCTYPE html>
<html>
<head><title>测试数据</title>
</head>
<body>{% for key, value in result.items() %}<div>keys:<span>{{key}}</span>values:<span>{{value}}</span></div>{% endfor %}
</body>
</html>

访问地址:127.0.0.1:5000/test

会话处理:

        所谓的会话,就是客户端浏览器和服务端网站之间一次完整的交互过程。会话的开始是在用户通过浏览器第一次访问服务端网站开始。会话的结束时在用户通过关闭浏览器以后,与服务端断开。所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。
        在客户端存储信息使用Cookie,token[jwt,oauth]
        在服务器端存储信息使用Session

COOKIE


语法:response.set_cookie("变量名", "变量值", max_age="有效期几秒")

from flask import Flask, make_response, request
app = Flask(__name__)@app.route('/set_cookie')
def set_cookie():response = make_response('set_cookie')response.set_cookie('name', 'pure')response.set_cookie('age', '18', max_age=3600)return response@app.route('/get_cookie')
def get_cookie():name = request.cookies.get('name')age = request.cookies.get('age')return "name={name}&age={age}"@app.route("/del_cookie")
def del_cookie():response = make_response("del cookie")response.set_cookie("name","",expires=0)return responseif __name__ == '__main__':app.run(debug = True)

SESSION 


SESSION使用session之前,必须先设置秘钥

from flask import Flask, session
app = Flask(__name__)class Config(object):SECRET_KEY = "12345678987654321"app.config.from_object(Config)@app.route('/set_session')
def set_session():session["name"] = "pure"session["age"] = 18session["book_list"] = [{"title": "book_name"}, {"title": "book_name"}]return "set_session"@app.route('/get_session')
def get_session():name = session.get("name")age = session.get("age")book_list = session.get("book_list")return "name={name} & age={age} & book_list = {book_list}"@app.route('/del_session')
def del_session():if session.get("name"):del session["name"]return "ok"if __name__ == '__main__':app.run(debug = True)

数据库

相关包:pip install pymysql

数据库连接: 

from flask import Flask
import mysql.connectorapp = Flask(__name__)mydb = mysql.connector.connect(host="localhost",user="root",passwd="root",database="test"
)
mycursor = mydb.cursor()mycursor.execute("SELECT * FROM user")myresult = mycursor.fetchall()     # fetchall() 获取所有记录for x in myresult:print(x)if __name__ == '__main__':app.run()

输出结果:

使用SQLAlchemy链接数据库

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/test'
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app)
class User(db.Model):id = db.Column('id', db.Integer, primary_key = True)username = db.Column(db.String(100))sex = db.Column(db.String(100))age = db.Column(db.Integer)def __init__(self, username, sex, age):self.username = usernameself.sex = sexself.age = age@app.route("/query",methods=['POST','get'])
def query():data = User.query.all()for x in data:print(x)if __name__ == '__main__':app.run()

输出结果:

        讲到这里,入门课程就已经讲完了,剩下的部分需要自己实操去解决问题了,以后小编会继续撰写相关文章

相关文章:

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架&#xff0c;Flask的核心包括Werkzeug工具箱和Jinja2模板引擎&#xff0c;它没有默认使用的数据库或窗体验证工具&#xff0c;这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…...

C/C++ 说说引用这玩仍是干啥的

引用的本质就是给某个实例对象起个外号。生活中李逵&#xff0c;也叫黑旋风。诸葛亮&#xff0c;又叫孔明。 引用的方式&#xff1a; 类型& 引用名对象名 举个例子 int i0; int& ki;//这种方式就是引用----->i有了自己的小名&#xff0c;从次叫k了 std::cout<…...

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…...

kubectl基础命令详解

管理名称空间资源 查看名称空间 [rootceshi-130 conf]# kubectl get ns [rootceshi-130 conf]# kubectl get namespace NAME STATUS AGE default Active 7d17h kube-node-lease Active 7d17h kube-public Active 7d17h kube-system …...

collection的遍历方式

增强for遍历 增强for的底层就是迭代器&#xff0c;为了简化迭代器的代码书写的。 他是jdk5之后出现的&#xff0c;其内部原理就是一个Iterator迭代器。 所有的单列集合和数组才能用增强for进行遍历。 package myCollection;import java.util.ArrayList; import java.util.C…...

SpringBoot中@Async使用注意事项

前言 Async这个注解想必大家都用过&#xff0c;是用来实现异步调用的。一个方法加上这个注解以后&#xff0c;当被调用时会使用新的线程来调用。但其实这里面也有一个坑。 问题 这个注解使用时存在如下问题&#xff1a;在没有自定义线程池的场景下&#xff0c;默认会采用Sim…...

IEEE 802.11 RTS/CTS/BA/Management

RTS/CTS IEEE 802.11 RTS/CTS即RTS/CTS协议(Request To Send/Clear To Send)即请求发送/清除发送协议是被802.11无线网络协议采用的一种用来减少由隐藏节点问题所造成的冲突的机制。 相当于一种握手协议,主要用来解决"隐藏终端"问题。"隐藏终端"(Hid…...

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…...

【C++】贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法&#xff0c;它在每一步选择中都采取当前状态下最优的选择&#xff0c;以希望最终得到全局最优解。贪心算法通常适用于满足最优子结构性质的问题&#xff0c;即问题的最优解可以通过其子问题的最优解…...

记一次dockerfile无法构建问题追溯

我有一个dockerfile如下&#xff1a; ENTRYPOINT ["/sbin/tini"&#xff0c;"-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先启动tini&#xff0c;再执行下面的cmd命令启动start.sh。 为啥要用tini&#xff1f; 因为我的这个docker…...

React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)

关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook&#xff0c;用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景&#xff0c;以及如何处理其依赖项&#xff0c;以帮…...

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…...

JPA常见异常 JPA可能抛出的异常

1、EntityNotFoundException&#xff08;实体不存在异常&#xff09;: 通过 JPA 查找一个不存在的实体。 2、NonUniqueResultException&#xff08;非唯一结果异常&#xff09;&#xff1a; 查询返回了多个结果&#xff0c;但期望只有一个结果。 3、TransactionRequiredExcep…...

Dockerfile的艺术:构建高效容器镜像的指令详解与实战指南

在容器化技术风靡全球的今天&#xff0c;Dockerfile作为构建 Docker 镜像的蓝图&#xff0c;其编写技巧与理解深度直接影响着应用部署的效率与稳定性。本文将深入剖析Dockerfile中的核心指令&#xff0c;以实战角度为您呈现一份详尽的解读与操作指南&#xff0c;并在文末抛出一…...

软件开发项目管理中各角色职责介绍

项目经理&#xff1a;项目经理在项目全生命周期中扮演着核心统筹与协调者的角色&#xff0c;负责从项目的启动、规划、执行、监控直至收尾的全过程管理。具体职责包括但不限于以下几点&#xff1a; 制定项目计划&#xff1a;依据项目业务主客户需求&#xff0c;明确项目范围、时…...

将时间转换为 `刚刚`、`几秒前`、`几分钟前`、`几小时前`、`几天前`、几月前或按照传入格式显示

const formatPast (date, type "default", zeroFillFlag true) > {// 定义countTime变量&#xff0c;用于存储计算后的数据let countTime;// 获取当前时间戳let time new Date().getTime();// 转换传入参数为时间戳let afferentTime new Date(date).getTime(…...

Oracle存储过程干货(二):PLSQL控制语句

注&#xff1a;本文的数据都来源于&#xff0c;oracle自带的emp表。 —if then elsif end if,单条件判断— declarev_grade char(1); beginv_grade : B;if v_grade A thendbms_output.put_line(哥真牛逼);elsedbms_output.put_line(哥还得加油);end if; end; /—if then els…...

深入Gradle:初识构建自动化的魅力

在软件开发的世界中&#xff0c;构建工具是不可或缺的一部分。它们帮助我们自动化编译、测试和打包应用程序的过程&#xff0c;从而节省时间并减少错误。在众多构建工具中&#xff0c;Gradle以其灵活性、可扩展性和卓越的性能而脱颖而出。本篇文章将带你走进Gradle的世界&#…...

cpp版ros2、opencv转换

ros2转opencv #include <opencv2/opencv.hpp> #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/image_encodings.hpp> ​ subscriber_ this->create_subscription<sensor_msgs::msg::Image>( "img", 10, std::bind(&Subs…...

使用API接口竞品价格监控

步骤一&#xff1a;确定监控目标和KPIs 目标&#xff1a;明确您希望通过监控竞品价格来实现的目标&#xff0c;例如保持价格竞争力、检测价格波动等。KPIs&#xff1a;设定关键绩效指标&#xff0c;如价格变动幅度、价格调整频率等。 步骤二&#xff1a;选择数据源和API 电商…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...