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风格接口
编号 | 方法 | 描述 |
1 | GET | 将数据以未加密的形式发送到服务器,这最常用的方法。 |
2 | HEAD | 与GET相同,但没有响应主体 |
3 | POST | 用于将HTML表单数据发送到服务器。通过POST方法接收的数据不会被服务器缓存。 |
4 | PUT | 用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE | 删除由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应用程序框架,Flask的核心包括Werkzeug工具箱和Jinja2模板引擎,它没有默认使用的数据库或窗体验证工具,这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单,…...
C/C++ 说说引用这玩仍是干啥的
引用的本质就是给某个实例对象起个外号。生活中李逵,也叫黑旋风。诸葛亮,又叫孔明。 引用的方式: 类型& 引用名对象名 举个例子 int i0; int& ki;//这种方式就是引用----->i有了自己的小名,从次叫k了 std::cout<…...

swoole
php是单线程。php是靠多进程来处理任务,任何后端语言都可以采用多进程处理方式。如我们常用的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的底层就是迭代器,为了简化迭代器的代码书写的。 他是jdk5之后出现的,其内部原理就是一个Iterator迭代器。 所有的单列集合和数组才能用增强for进行遍历。 package myCollection;import java.util.ArrayList; import java.util.C…...
SpringBoot中@Async使用注意事项
前言 Async这个注解想必大家都用过,是用来实现异步调用的。一个方法加上这个注解以后,当被调用时会使用新的线程来调用。但其实这里面也有一个坑。 问题 这个注解使用时存在如下问题:在没有自定义线程池的场景下,默认会采用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:解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法:对比度保持连贯性损失(CCPL) 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习:在无需标签的情况下有效学习区分…...
【C++】贪心算法
贪心算法(Greedy Algorithm)是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下最优的选择,以希望最终得到全局最优解。贪心算法通常适用于满足最优子结构性质的问题,即问题的最优解可以通过其子问题的最优解…...

记一次dockerfile无法构建问题追溯
我有一个dockerfile如下: ENTRYPOINT ["/sbin/tini","-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先启动tini,再执行下面的cmd命令启动start.sh。 为啥要用tini? 因为我的这个docker…...
React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)
关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook,用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景,以及如何处理其依赖项,以帮…...

yolov5v7v8目标检测增加计数功能--免费源码
在yolo系列中,很多网友都反馈过想要在目标检测的图片上,显示计数功能。其实官方已经实现了这个功能,只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程,教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…...
JPA常见异常 JPA可能抛出的异常
1、EntityNotFoundException(实体不存在异常): 通过 JPA 查找一个不存在的实体。 2、NonUniqueResultException(非唯一结果异常): 查询返回了多个结果,但期望只有一个结果。 3、TransactionRequiredExcep…...
Dockerfile的艺术:构建高效容器镜像的指令详解与实战指南
在容器化技术风靡全球的今天,Dockerfile作为构建 Docker 镜像的蓝图,其编写技巧与理解深度直接影响着应用部署的效率与稳定性。本文将深入剖析Dockerfile中的核心指令,以实战角度为您呈现一份详尽的解读与操作指南,并在文末抛出一…...
软件开发项目管理中各角色职责介绍
项目经理:项目经理在项目全生命周期中扮演着核心统筹与协调者的角色,负责从项目的启动、规划、执行、监控直至收尾的全过程管理。具体职责包括但不限于以下几点: 制定项目计划:依据项目业务主客户需求,明确项目范围、时…...
将时间转换为 `刚刚`、`几秒前`、`几分钟前`、`几小时前`、`几天前`、几月前或按照传入格式显示
const formatPast (date, type "default", zeroFillFlag true) > {// 定义countTime变量,用于存储计算后的数据let countTime;// 获取当前时间戳let time new Date().getTime();// 转换传入参数为时间戳let afferentTime new Date(date).getTime(…...
Oracle存储过程干货(二):PLSQL控制语句
注:本文的数据都来源于,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:初识构建自动化的魅力
在软件开发的世界中,构建工具是不可或缺的一部分。它们帮助我们自动化编译、测试和打包应用程序的过程,从而节省时间并减少错误。在众多构建工具中,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接口竞品价格监控
步骤一:确定监控目标和KPIs 目标:明确您希望通过监控竞品价格来实现的目标,例如保持价格竞争力、检测价格波动等。KPIs:设定关键绩效指标,如价格变动幅度、价格调整频率等。 步骤二:选择数据源和API 电商…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)
13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

MCP和Function Calling
MCP MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而…...