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

news2024/11/15 9:00:05

        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 response
        
if __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"] = 18
    session["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.connector

app = 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 SQLAlchemy

app = Flask(__name__)

# 数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/test'
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

db = 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 = username
             self.sex = sex
             self.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()

输出结果:

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

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

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

相关文章

Qt/事件分发器/事件过滤器

事件分发器 //事件分发器bool event(QEvent* e); //事件分发器&#xff1a;&#xff1a;用途 分发事件 bool MyLabel::event(QEvent* e) {if(e->type() QEvent::MouseButtonPress){//如果是鼠标摁下 拦截事件 不向下分发QMouseEvent* ev static_cast<QMouseEvent*>…

【JS 算法题: 将 json 转换为字符串】

题目简介 其实就是手撕 JSON.stringfy()。 算法实现 输入 原则上来说&#xff0c;输入的是一个 json 对象。但需要考虑到异常情况&#xff0c;即输入了其它类型的数据&#xff0c;比如&#xff1a;12, true, ‘abc’, [‘red’, ‘green’], null, undefined 等。 输出 …

AGM CPLD (AGRV2K )的时钟(外部时钟和片上内部振荡器)

AGM CPLD &#xff08;AGRV2K &#xff09;的时钟(外部时钟和片上内部振荡器) 外部晶振 与 内部振荡器&#xff1a; mcu 和 cpld 联合编程时&#xff0c; 整颗芯片需要一颗外部晶振。 &#xff08;芯片有内部振荡器&#xff0c; 但误差较大&#xff0c; 校准后 5%以内误差&…

LSTM 长短期记忆递归神经网络

1、神经网络简介 1.1 神经网络起源 人工神经网络&#xff08;Aritificial Neural Networks, ANN&#xff09;是一种仿生的网络结构&#xff0c;起源于对人类大脑的研究。人工神经网络&#xff08;Aritificial Neural Networks&#xff09;也常被简称为神经网络&#xff08;Ne…

Vue3_2024_3天【Vue3组合式API~响应式及toRefs】

第一&#xff1a;vue3 中可以两个script标签 第一个&#xff1a;声明组件名 第二个&#xff1a;setup语法糖&#xff08;默认 lang语言是js语言&#xff0c;修改语言须保持一致&#xff09; 若想去掉一个script标签&#xff08;声明组件名称&#xff09;&#xff0c;则可使用插…

八. 实战:CUDA-BEVFusion部署分析-学习CUDA-BEVFusion推理框架设计模式

目录 前言0. 简述1. 回顾一下RAII是什么2. 实现类&#xff0c;接口类与命名空间3. CUDA-BEVFusion设计框架(namespace)4. CUDA-BEVFusion设计框架(接口类)5. CUDA-BEVFusion设计框架(实现类)6. CUDA-BEVFusion设计框架(各个类负责的内容)7. CUDA-BEVFusion中的接口函数和实现类…

failed to connect to ‘127.0.0.1:58526‘: Connection refused

WSA使用体验 链接&#xff1a; 知乎-穿越时间一步到位&#xff0c;教你完美安装Windows 11 Android 安卓子系统 CPU不满足要求 明明是12700H&#xff0c;满足要求&#xff0c;但是应用商店说不满足&#xff0c;在设置&#xff08;注意不是控制面板的区域&#xff09;把地区改…

ChatGPT 4.0使用之论文阅读

文章目录 阅读环境准备打开AskYourPDF进入主站 粗读论文直接通过右侧边框进行提问选中文章内容翻译或概括插图的理解 总结 拥有了GPT4.0之后&#xff0c;最重要的就是学会如何充分发挥它的强大功能&#xff0c;不然一个月20美元的费用花费的可太心疼了&#xff08;家境贫寒&…

HTML~

HTML HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的HTML(HyperText Markup Language):超文本标记语言 超文本:超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还可以定义图片、音频、视频等内容 标记语言:由标签构成的语言 …

谨用ArrayList中的subList方法

谨用ArrayList中的subList方法 规范一&#xff1a; ArrayList 的 subList 结果不可强转成 ArrayList&#xff0c;否则会抛出 ClassCastException 异常&#xff1a; public static void test7() {List<Integer> list new ArrayList<>();list.add(1);list.add(2);…

云服务器无法Ping通解决

问题: 使用公网IP地址PING云服务器,无法PING通 但是可SSH到服务器,表示通信链路是正常的,可能是端口或路径规则未开放导致 登陆云服务器后台,进行安全组规则查看,发现ICMP没有放行 添加允许ICMP连接规则 成功PING通云服务器

Linux文本处理三剑客:awk(结构化命令)

在Linux操作系统中&#xff0c;grep、sed、awk被称为文本操作“三剑客”&#xff0c;上几期中&#xff0c;我们详细介绍grep、sed、awk的基本使用方法&#xff0c;希望能够帮助到有需要的朋友。 目录 1、前言 2、条件控制语句 语法结构&#xff1a;IF 语法结构&#xff1a…

蓝桥杯练习题——前缀和

1.壁画 思路 1.求最坏情况下&#xff0c;画的墙总和是多少 2.画的墙在中间连续一段&#xff0c;画了的墙长度是 n / 2 向上取整 3.取最大的 n / 2 向上取整区间和 #include<iostream> using namespace std; const int N 5e6 10; char s[N]; int a[N]; int t, n;int m…

【RHEL】三分钟启动完整版vim——vim9 huge编译安装

详细安装步骤 一键安装传送门 Vim提供了许多快捷键和命令来加快文本编辑的速度和效率。它具有强大的搜索和替换功能&#xff0c;支持多种文件格式&#xff0c;可以通过插件扩展功能&#xff0c;并提供了强大的自动补全功能。   然而在大多数Linux操作系统中利用系统软件源安装…

【深度学习笔记】计算机视觉——锚框

锚框 目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;ground-truth bounding box&#xff09;。 不同的模型使用的区域采样方法可能不同。 这里…

事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测

事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测 目录 事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测预测效果基本描述程序设计参考资料 预测效果 基本描述 Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测 运行环境: Matlab2023及以 上…

Nature 研究亮点(Volume 626 Issue 8001, 29 February 2024)

文章目录 激光雕刻肥皂膜卵细胞的回收系统巴斯克语的起源产后抑郁症的治疗 激光雕刻肥皂膜 研究者&#xff1a;Haitao Xu 和 Yu Zhao&#xff0c;清华大学&#xff0c;北京。 发现&#xff1a;在特定条件下&#xff0c;可以使用激光在肥皂膜上进行雕刻。肥皂膜由洗涤剂分子&am…

ElasticSearch DSL语法

一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式&#xff1a;GET 请求地址&#xff1a;_mget 功能说明 &#xff1a; 可以通过ID批量获取不同index和type的数据 请求参数&#xff1a; docs : 文档数…

Tomcat介绍在IDEA中创建JavaWeb工程

文章目录 一、WEB服务器服务器概述使用Java代码手写web服务器 二、服务器软件Web服务器服务器软件的使用步骤 三、TomcatTomcat的下载Tomcat的安装与卸载Tomcat的启动与关闭常见问题 四、新建Java Web项目并将项目部署到tomcat中新建Java Web项目将项目部署到Tomcat中出现的问题…

在你的 Vue + Electron 项目里,引入 ESLint

因为我的项目是基于 Electron 平台的 Web 应用&#xff0c;使用 Vue 3 实现&#xff0c;而且用了 TypeScript&#xff0c;所以&#xff0c;在引入 ESLint 的时候&#xff0c;要考虑好几种规范的问题。 文章目录 零、简介1. 规则2. 配置文件3. 共享配置4. 插件5. 解析器6. 自定义…