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()

输出结果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】还有柔性数组?

前言 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。C99中&#xff0c;结构中的最后⼀个元素允许是未知⼤⼩的数组&#xff0c;这就叫做『柔性数组』成员。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xf…

Java基于微信小程序的旅游出行必备小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢&#xff1f; RabbitMQ在接收到消息后&#xff0c;默认并不会立即进行持久化&#xff0c;而是先把消息暂存在内存中&#xff0c;这时候如果MQ挂了&#xff0c;那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…

【论文阅读】Usenix Security 2023 你看不见我:对基于激光雷达的自动驾驶汽车驾驶框架的物理移除攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.作者贡献4.主要图表5.结论 一.论文信息 论文题目&#xff1a; You Can’t See Me: Physical Removal Attacks on LiDAR-based Autonomous Vehicles Driving Frameworks&#xff08;你看不见我:对基于激光雷达的自动驾驶汽车驾驶…

如何搭建Nacos集群

1.搭建Nacos集群 众所周知&#xff0c;在实际的工作中&#xff0c;Nacos的生成环境下一定要部署为集群状态 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们计划的集群结构&#xff1a; 我就直接在本机上开三个Nacos来搭…

Linux网络编程(五-IO模型)

目录 一、同步I/O 二、异步I/O 三、阻塞I/O 四、非阻塞I/O 五、信号驱动I/O ​六、多路复用IO 一、同步I/O 在操作系统中&#xff0c;程序运行的空间分为内核空间和用户空间&#xff0c; 用户空间所有对io操作的代码(如文件的读写、socket的收发等)都会通过系统调用进…

纯css+html实现拟态开关按钮面板

适合智能家居的开关面板UI 参考&#xff1a;https://drams.framer.website/

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

springboot+vue+mysql项目使用的常用注解

实体类常用注解 Data Data 是一个 Lombok 提供的注解&#xff0c;使用 Data 注解可以简化代码&#xff0c;使代码更加简洁易读。 作用&#xff1a;自动为类生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依赖 <depende…

Linux高级编程:网络

回顾&#xff1a; 进程间的通信&#xff1a; 同一主机内通信&#xff1a; 传统的进程间通信方式&#xff08;管道、信号&#xff09;&#xff1b; IPC对象&#xff08;共享内存&#xff0c;消息队列&#xff0c;信号量集&#xff09;&#xff1b; 不同主机间进程的通信&#…

C++ 链表OJ

目录 1、2. 两数相加 2、24. 两两交换链表中的节点 3、143. 重排链表 4、23. 合并 K 个升序链表 5、25. K 个一组翻转链表 解决链表题目常用方法&#xff1a; 1、画图 2、引入虚拟"头”结点 便于处理边界情况方便我们对链表操作 3、大胆定义变量&#xff0c;减少连接…

STM32CubeMX软件界面花屏,混乱的解决方案。

添加系统环境变量:J2D_D3D 值:false 即可解决。

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

机器学习中类别不平衡问题的解决方案

类别不平衡问题 解决方案简单方法收集数据调整权重阈值移动 数据层面欠采样过采样采样方法的优劣 算法层面代价敏感集成学习&#xff1a;EasyEnsemble 总结 类别不平衡&#xff08;class-imbalance&#xff09;就是指分类任务中不同类别的训练样例数目差别很大的情况 解决方案…

信呼OA普通用户权限getshell方法

0x01 前言 信呼OA是一款开源的OA系统&#xff0c;面向社会免费提供学习研究使用&#xff0c;采用PHP语言编写&#xff0c;搭建简单方便&#xff0c;在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…

码住!微信自动回复的实现方式

对于很多企业和个人来说&#xff0c;如何高效地回复微信客户消息是一个非常重要的问题。在这样的需求下&#xff0c;使用微信管理系统的机器人自动回复功能成为了一种不错的选择。 1、自动通过好友 当有大量的好友请求时&#xff0c;手动处理好友申请会变得非常繁琐。而微信管…

C++max函数的使用案例20个

文章目录 1. **基本用法&#xff1a;**2. **比较浮点数&#xff1a;**3. **比较字符串&#xff1a;**4. **使用自定义比较函数&#xff1a;**5. **比较容器中的元素&#xff1a;**6. **使用std::initializer_list&#xff1a;**7. **变长参数版本&#xff08;C11及以上&#xf…

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

Android多线程实现方式及并发与同步,Android面试题汇总

一. 开发背景 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序&#xff0c;再由桌面程序来控制不同的硬件设…