Python-flask项目入门

一、flask对于简单搭建一个基于python语言-的web项目非常简单

二、项目目录

示例代码 git路径

 三、代码介绍

1、安装pip依赖

通过pip插入数据驱动依赖pip install flask-sqlalchemy 和 pip install pymysql

2.配置数据源 config.py

DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = '123456'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'tgcrm'

# mysql 不会认识utf-8,而需要直接写成utf8
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
                                                                       DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True

# 加载密钥
key_access = '&^_^&protect*py_&^_^&'

3、引用orm框架 访问数据库

/mapper/exts.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

4、启动文件 app.py

from flask import Flask
# 引用数据库启动文件
from mapper.exts import db
# 引用数据库配置文件
import config
# 引用数据库
from controller.user_controller import *

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)

app.register_blueprint(user, url_prefix="/user")

# 全局拦截器校验token
@app.before_request
def before():
    key = str(request.headers.get('TOKEN'))
    if key != format(config.key_access):
        return 'Password error'
    else:
        pass

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8060)

5、数据库操作

通过Flask提供orm框架对数据库进行操作

5.1增加

# 添加 http://127.0.0.1:5000/user/add/2/1
@user.route('/add/<username>/<pwd>')
def add_user(username, pwd):
    print(username, pwd)
    userinfo = User(username=username, pwd=pwd)
    db.session.add(userinfo)
    db.session.commit()
    # # 接受前端发来的数据
    # data = json.loads(request.form.get('data'))
    #
    # # lesson: "Operation System"
    # # score: 100
    # lesson = data["lesson"]
    # score = data["score"]
    #
    # # 自己在本地组装成Json格式,用到了flask的jsonify方法
    # info = dict()
    # info['name'] = "pengshuang"
    # info['lesson'] = lesson
    # info['score'] = score
    # return jsonify(info)
    return jsonify("ADD_SUCCESS")

5.2删除

@user.route('/delete/<int:id>')
def delete_user(id):
    print(id)
    # 第一种
    user1 = User.query.filter().first()
    print(user1.id)
    db.session.delete(user1)
    db.session.commit()
    # 第二种
    user2 = User.query.filter(User.id == 2).delete()
    db.session.commit()
    return jsonify("DELETE_SUCCESS")

5.3修改

@user.route('/update/<int:id>')
def update_user(id):
    user1 = User.query.filter(User.id == id).first()
    user1.username = "我是修改后的"
    db.session.merge(user1)
    db.session.commit()
    return jsonify("UPDATE_SUCCESS")

5.4查询

@user.route('/list')
def list_users():
    users = User.query.all()
    print(users)
    users_output = []
    for user in users:
        users_output.append(user.to_json())
    return jsonify(users_output)

5.5条件查询

1.filter_by和filter

两种写法根据版本的不同:

filter_by: 用于查询简单的列名,不支持比较运算符

filterfilter_by的功能更强大,支持比较运算符,支持or_in_等语法。

  1. data = UserInfo.query.filter(UserInfo.name=='1').all()

  2. data = UserInfo.query.filter_by(name='1').all()

1.  根据用户名查询符合条件的第一条数据
User.query.filter_by(username=username).first()
print("查询1:", user1.to_json())
    
2. 查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.username.endswith('g')).all()
User.query.filter(User.username.contains('g')).all()

3. 查询名字不等于wang的所有数据[2种方式]
 from sqlalchemy import not_
注意了啊:逻辑查询的格式:逻辑符_(类属性其他的一些判断)
User.query.filter(not_(User.username=='yang')).all()
User.query.filter(User.username!='yang').all()

4. 查询名字和邮箱都以 li 开头的所有数据[2种方式]
from sqlalchemy import and_
User.query.filter(and_(User.username.startswith('li'), User.email.startswith('li'))).all()
User.query.filter(User.username.startswith('li'), User.email.startswith('li')).all()

5. 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
from sqlalchemy import or_
User.query.filter(or_(User.pwd=='123456', User.email.endswith('tiantian.com'))).all()

6. 查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()

7. 查询name为liu的角色数据 关系引用
# 举例 暂时没有 
User.query.filter_by(username='liu').first().role.name

8.获取第一条记录
User.query.first()

6、分页对象

  • has_prev/has_next——是否有上一页/下一页

  • Items——当前页的数据列表

  • prev_num/next_num——上一页/下一页的页码

  • total——总记录数

  • pages——总页数

@user.route('/loadUserPage/<int:page>/<int:per_page>')
def list_user(page, per_page):
    """ 用户分页 """
    # 每一页的数据大小-per_page 页码-page
    # 1. 查询用户信息
    user = User.query
    # 2. 准备分页的数据
    print(page, per_page)
    user_page_data = user.paginate(page, per_page=per_page)
    users_output = []
    for user in user_page_data.items:
        users_output.append(user.to_json())
    print("当前页的数据列表", users_output)
    print("是否有上一页", user_page_data.has_prev)
    print("是否下一页", user_page_data.has_next)
    print("上一页的页码", user_page_data.prev_num)
    print("下一页的页码", user_page_data.next_num)
    print("总记录数", user_page_data.total)
    print("总页数", user_page_data.pages)
    return jsonify(users_output)
""" 输出
当前页的数据列表 [{'pwd': '2', 'id': 2, 'username': '2', 'nick': '2'}]
是否有上一页 True
是否下一页 True
上一页的页码 1
下一页的页码 3
总记录数 7
总页数 7
"""

四、多模块配置 蓝图blueprint

在app项目中引用,可以在app中声明多个路径 /user、/admin 、/customer等等

from controller.user_controller import user

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)

app.register_blueprint(user, url_prefix="/user")

在子应用中声明 controller/user_controller

from flask import Blueprint, jsonify, request, json

user = Blueprint('user', __name__)

# 查询全部 http://127.0.0.1:5000/user/list
@user.route('/list')
def list_users():
    users = User.query.all()
    print(users)
    users_output = []
    for user in users:
        users_output.append(user.to_json())
    return jsonify(users_output)

五、统一过滤器

在app.py文件加入前置过滤器

# 引用配置文件
import config

# 全局拦截器校验token
@app.before_request
def before():
    key = str(request.headers.get('TOKEN'))
    if key != format(config.key_access):
        return 'Password error'
    else:
        pass

配置文件包括

# 加载密钥
key_access = '&^_^&protect*py_&^_^&'

此时通过postman访问接口,会对header进行请求头校验,不满足请求直接被打回

 直接当携带了TOKEN=xxxx才可以正常访问该接口

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL-每日一题【1164. 指定日期的产品价格】

题目 产品数据表: Products 写一段 SQL来查找在 2019-08-16 时全部产品的价格&#xff0c;假设所有产品在修改前的价格都是 10 。 以 任意顺序 返回结果表。 查询结果格式如下例所示。 示例 1: 解题思路 1.题目要求我们查找在 2019-08-16 时全部产品的价格&#xff0c;假设所…

关于java异常的整理

文章目录 一、异常分类二、throw、throws、try-catch-finally三、CglibAopProxy中对异常的处理4、关于UndeclaredThrowableException 一、异常分类 java异常层级结构 Throwable:所有异常的根接口 Error:严重错误,程序无法处理和恢复 例如VirtualMachineError,OOMError等 Excep…

【图像去噪】基于原始对偶算法优化的TV-L1模型进行图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

8.5作业

要求实现AB进程对话 a.A进程先发送一句话给B进程&#xff0c;B进程接收后打印 b.B进程再回复一句话给A进程&#xff0c;A进程接收后打印 c.重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 A进程 #include<stdio.h> #include<string.h> #include&…

【新版系统架构补充】-七层模型

网络功能和分类 计算网络的功能 &#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标&#xff1a;速率、带宽&#xff08;频带宽度或传送线路速率&#xff09;、吞吐量、时延、往返时间、利用率 网络非性能指标&#xff1a;费用、质量、标准化…

【Rust】Rust学习

文档&#xff1a;Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (bootcss.com) 墙裂推荐这个文档 第一章入门 入门指南 - Rust 程序设计语言 简体中文版 第二章猜猜看游戏 猜猜看游戏教程 - Rust 程序设计语言 简体中文版 (bootcss.com) // 导入库 use std::io; use s…

2023.08.01 驱动开发day8

驱动层 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/of_gpio.h>#…

NVM保姆级安装配置

nvm安装配置 1、NVM简介2、NVM安装三、NVM使用四、NVM常用命令 1、NVM简介 在项目开发过程中&#xff0c;使用到vue框架技术&#xff0c;需要安装node下载项目依赖&#xff0c;但经常会遇到node版本不匹配而导致无法正常下载&#xff0c;重新安装node却又很麻烦。为解决以上问…

Docker 网络模型使用详解 (1)Dockers网络基础

目录 环境准备 Dockers 网络基础 1.端口映射 查看随机映射端口范围 -p可以指定映射到本地端口 映射指定地址和指定端口 映射指定地址 宿主机端口随机分配 指定传输协议 端口暴露 容器互联 自定义网络 现在把container7加入到demo_net中 在启动一个容器加入到demo_net…

Linux进程(二)

文章目录 进程&#xff08;二&#xff09;Linux的进程状态R &#xff08;running&#xff09;运行态S &#xff08;sleeping&#xff09;阻塞状态D &#xff08;disk sleep&#xff09;深度睡眠T&#xff08;stopped&#xff09;状态X&#xff08;dead&#xff09;状态Z&#x…

数据结构 二叉树(C语言实现)

绪论 雄关漫道真如铁&#xff0c;而今迈步从头越。 本章将开始学习二叉树&#xff08;全文共一万两千字&#xff09;&#xff0c;二叉树相较于前面的数据结构来说难度会有许多的攀升&#xff0c;但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。 话不多说安全带系好&…

关于 Ubuntu 长按 shift 无效, 按 Esc 直接进入 grub 改密码的解决方法

本次长按shift没有反应&#xff0c;直接进入了系统界面&#xff0c;所以改用长按Esc键&#xff0c;步骤如下&#xff1a; 1. 长按esc&#xff0c;进入grub>提示 2.输入grub>normal &#xff0c;回车 3.上一步回车后&#xff0c;继续敲击Esc &#xff0c;出现grub界面 …

HCIP---OSPF的优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.汇总&#xff1a; 目的&#xff1a;减少骨干区域的LSA的更新量 作用&#xff1a;OSPF的…

可缝合神经网络

文章目录 Stitchable Neural Networks摘要本文方法实验结果 Stitchable Neural Networks 摘要 包含大量强大的预训练模型族(如ResNet/DeiT)的model zoo已经达到了前所未有的范围&#xff0c;这对深度学习的成功有重要贡献。由于每个模型族都由具有不同尺度的预训练模型(例如&…

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…

Docker实战-关于Docker镜像的相关操作(二)

导语   之前的分享中&#xff0c;我们介绍了关于Docker镜像的查询操作相关的内容&#xff0c;下面我们继续来介绍删除清理、导入导出、创建镜像等操作。 如何删除和清理镜像&#xff1f; 使用标签删除镜像 可以使用docker rmi 或者是 docker image rm 命令来删除镜像&#x…

Spring源码之XML文件中Bean标签的解析1

读取XML文件&#xff0c;创建对象 xml文件里包含Bean的信息&#xff0c;为了避免多次IO&#xff0c;需要一次性读取xml文件中所有bean信息&#xff0c;加入到Spring工厂。 读取配置文件 new ClassPathResource("applicationContext.xml")ClassPathResource是Sprin…

微信小程序nodejs+vue+uniapp高校食堂线上预约点餐系统

本次设计任务是要设计一个食堂线上预约点餐系统&#xff0c;通过这个系统能够满足管理员及学生的食堂线上预约点餐分享功能。系统的主要包括首页、个人中心、学生管理、菜品分类管理、菜品管理、关于我们管理、意见反馈、系统管理、订单管理等功能。 开发语言 node.js 框架&am…

Flink之RedisSink

在Flink开发中经常会有将数据写入到redis的需求,但是Flink官方并没有对应的扩展包,这个时候需要我们自己编译对应的jar资源,这个时候就用到了bahir,barhir是apahce的开源项目,是专门给spark和flink提供扩展包使用的,bahir官网,这篇文章就介绍下如何自己编译RedisSink扩展包. 下…

Prometheus服务器、Prometheus被监控端、Grafana、Prometheus服务器、Prometheus被监控端、Grafana

day03 day03Prometheus概述部署Prometheus服务器环境说明&#xff1a;配置时间安装Prometheus服务器添加被监控端部署通用的监控exporterGrafana概述部署Grafana展示node1的监控信息监控MySQL数据库配置MySQL配置mysql exporter配置mysql exporter配置prometheus监控mysql自动…