Flask

 简介

  • django是个大而全的框架,flask是一个轻量级的框架
  • django内部为我们提供了非常多的组件:orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接
  • flask框架本身没有太多的功能,路由/视图/模板(jinja2)/session/中间件,第三方组件非常齐全
  • django的请求处理是逐一封装和传递:flask的请求是利用上下文管理来实现的

flask快速使用

安装: pip install flask

1.1依赖wsgi Werkzeug

from werkzeug.serving import run_simple
def func(envi,a):
    print('请求来了')
    pass
if __name__ == '__main__':
    run_simple('127.0.0.1',5001,func)

 1.2快速使用flask

090e0a6611c44d06acd143f64c103371.png

 

//app.py
from flask import Flask

#使用Flask类创建一个app对象
#__name __代表当前app.py这个模块
#1.以后出现bug,它可以帮助我们快速定位
#2.对于寻找模板文件,有一个相对路径
app = Flask(__name__)
#创建一个路由和视图函数的映射
@app.route("/")
def hello_world():
    return 'hello world'
if __name__=='__main__':
    app.run()

用户登录

c3c05bffc1e74593a52c3a09b5c88fb8.png

 

from flask import Flask, render_template, jsonify, request, redirect

app = Flask(__name__,template_folder="templates")#默认
@app.route('/login',methods=['GET','POST'])
def login():
    #return '登录' #HttpResponse
    # return jsonify({'code':1000,'data':[1,2,3]})#JsonResponse
    if request.method=='GET':
        return render_template('login.html')  #render
    user=request.form.get('user')
    pwd=request.form.get('pwd')
    if user=='changxin' and pwd=='dsb':
        return redirect('/index')
    error='用户名或密码错误'
    return render_template('login.html',**{'error':error})#或者error=error
@app.route('/index')
def index():
    return '首页'
if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="提交"><span style="color: red">{{error}}</span>
    </form>
</body>
</html>

项目配置

Debug模式

开启debug模式

我开启后刷新无效?

host配置

主要作用:就是让其他电脑访问我电脑上的flask项目

a83a7fb03b2e408582e343785ede7946.png

 post

上图中后面添加 --port=8000(注意空格隔开)

url视图

451c1de7e40d41899784c43a3654c97c.png

 带参数的url

@app.route("/blog/<int:blog_id>")
def blog_detail(blog_id):
    return "您访问的博客是:%s" %blog_id

查询字符串的方式传参

/book/List:会给我返回第一页的数据

/book/List?page=2,获取第二页的数据

 

@app.route('/book/list')
def book_list():
    #arguments:参数
    #request.args:类字典类型
    page=request.args.get("page",default=1,type=int)
    return f"您获取的是第{page}的图书列表!"

jinja2模板使用

ff3d6f7d967a4a56867a54d8a3a9a082.png

 

from flask import Flask,render_template

app = Flask(__name__)
#url:http/https://www.qq.com

@app.route('/')
def hello_world():  # put application's code here
    return render_template("index.html")
if __name__ == '__main__':
    app.run()

html自动生成标签:书写div然后按tab自动补全

 后端传参

@app.route('/blog/<blog_id>')
def blog_detail(blog_id):
        return render_template("blog_detail.html",blog_id=blog_id)

blog_detail.html

<h1>{{blog_id}}</h1>

模板的对象属性

class User:
    def __init__(self,username,email):
        self.username=username
        self.email=email

@app.route('/xiao')
def hello_world():
    user=User(username="芬达",email="学霸")
    return render_template("index.html",user=user)
{{ user.username}}

字典引用{{person["key"]}}或者{{person.key}}

过滤器的使用

 

{{person.key|length}}

自定义过滤器

def datetime_format(value,format="%Y-%m-%d %H:%M" ):
    return value.strftime(format)
app.add_template_filter(datetime_format,"dformat")
def filter_demo():
    mytime=datetime.now()
    return render_template("index.html",mytime=mytime)
{{mytime|dformat}}

控制语句

@app.route('/xiao')
def hello_world():
    age=19
    return render_template("index.html",age=age)

9118224ff53a4652afa2463681aa2d76.png

 

@app.route('/xiao')
def hello_world():
    age=19
    books=[{"name":"小木",
            "age":15
            },
           {"name":"小bing",
            "age":18
            }]
    return render_template("index.html",age=age,books=books)
    {% for book in books %}
        <div>名字:{{ book.name}},年龄:{{ book.age }}</div>
    {% endfor %}

模板继承

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是父模板</title>
</head>
<body>
我是父模板的文字
</body>
</html>

child.html

{% extends "base.html" %}

app.py

@app.route('/xiao')
def hello_world():
    return render_template("child.html")

{%block%}

base.html

<title>{%block title%}{%endblock%}</title>
<body>
    {%block body%}
    {%endlock%}
</body>

child.html

{% block  title%}
    我是父模板的标题
{% endblock %}
{% block  body%}
    我是父模板的body
{% endblock %}

 

 加载静态文件

cf53da65e7b3476c9a82126cad33a917.png

 

<img src="{{url_for('static',filename='images/ironman.jpg')}}" alt="">

对象关系模型ORM

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text


app = Flask(__name__)

HOSTNAME="127.0.0.1"
PORT=3306
USERNAME="root"
PASSWORD="15175857475a"
DATABASE="xiao"
app.config["SQLALCHEMY_DATABASE_URI"]=f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
#在app.config中设置好链接数据库的信息
#然后使用SQLAlchemy(app)创建一个db对象
#SQLAlchemy会自动读取app.config中链接数据库信息
db=SQLAlchemy(app)
#测试是否链接成功
# with app.app_context():
#     with db.engine.connect() as conn:
#         rs = conn.execute(text("select 1"))
#         print(rs.fetchone())
class User(db.Model):
    __tablename__ = "user"
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    username=db.Column(db.String(100),nullable=False)
    password=db.Column(db.String(100),nullable=False)
user=User(username="法外",password='11111')
with app.app_context():
    db.create_all()
@app.route('/')
def hello_world():
    return "hello"

if __name__ == '__main__':
    app.run()

数据的增删改查操作

@app.route("/user/add")
def add_user():
    #1.创建ORM对象
    user = User(username="法外", password='11111')
    #2.将ORM对象添加到db.session中
    db.session.add(user)
    #3.将db.session中的改变同步到数据库中
    db.session.commit()
    return "用户创建成功"

@app.route("/user/query")
def query_user():
    #1.get查找:根据主键查找
    user=User.query.get(1)
    print(f"{user.id}:{user.username}{user.password}")
    #2.filter_by查找
    users=User.query.filter_by(username="法外")
    for user in users:
        print(user.username)
    return "数据查找成功"

@app.route("/user/update")
def update_user():
    user=User.query.filter_by(username="法外").first()
    user.password="2222222"
    db.session.commit()
    return "数据修改成功"

@app.route("/user/delete")
def delete_user():
    user=User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "数据删除成功"

表关系

class Article(db.Model):
    __tablename__="article"
    id=db.Column(db.integer,primary_key=True,autoincrement=True)
    title=db.Column(db.String(200),nullable=False)
    content=db.Column(db.Text,nullable=False)
    #添加作者的外键
    author_id=db.Column(db.Integer,db.ForeignKey("user.id"))
    author=db.relationship("User")
article=Article(title="Flask",content="pig")

 

 

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

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

相关文章

【MQTT】Esp32数据上传采集:最新mqtt插件(支持掉线、真机调试错误等问题)

前言 这是我在Dcloud发布的插件-最完整Mqtt示例代码&#xff08;解决掉线、真机调试错误等问题&#xff09;&#xff0c;经过整改优化和替换Mqtt的js文件使一些市场上出现的问题得以解决&#xff0c;至于跨端出问题&#xff0c;可能原因有很多&#xff0c;例如&#xff0c;合法…

Python 字典 get()函数使用详解,字典获取值

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 get函数使用详解 1、设置默认返回值2、嵌套字典取值3、get() 和 dict[key] 的区别…

长短期记忆网络(LSTM)原理解析

长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;是一种常用于处理序列数据的深度学习模型。它在循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的基础上进行了改进&#xff0c;旨在解决传统RNN中的梯度消失…

myAgv的slam算法学习以及动态避障下篇

引言 在之前的一篇文章中有提到购入了一台myAGV&#xff0c;以树莓派4B为控制核心的移动机器人。上篇文章中向大家介绍了myAGV如何实现建图、导航以及静态避障&#xff0c;但我们深知&#xff0c;这只是机器人自主导航能力的基础。在实际应用场景中&#xff0c;机器人需要面对复…

Segment Tree 线段树算法(java)

线段树算法 Segment Tree 线段树算法代码演示 蓄水池算法 Segment Tree 线段树算法 什么是线段树算法&#xff1a; 线段树&#xff08;Segment Tree&#xff09;是一种基于树结构的数据结构&#xff0c;用于解决区间查询问题&#xff0c;例如区间最大值、最小值、区间和等。线段…

Learning Enriched Features for Fast Image Restoration and Enhancement 论文阅读笔记

这是2022年TPAMI上发表的大名鼎鼎的MIRNetv2&#xff0c;是一个通用的图像修复和图像质量增强模型&#xff0c;核心是一个多尺度的网络 网络结构整体是残差的递归&#xff0c;不断把残差展开可以看到是一些残差块的堆叠。核心是多尺度的MRB。网络用的损失函数朴实无华&#x…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

1. HTML5的新特性

HTML5的新增特性主要是针对于以前的不足, 增了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题,基本是IE9以上版本的浏览器才支持, 如果不考虑兼容性问题,可以大量使用这些新特性。 1.1 HTML5 新增的语义化标签 ●<header> : 头部标签 ●<nav&…

什么是Heatmap(热图)图表?用DHTMLX可实现快速构建

DHTMLX Chart是DHTMLX最新发布的JavaScript UI小部件库的核心内容之一&#xff0c;这个图表小部件收到了几个重要的更新&#xff0c;但其中最引人注目的是一个新的数据可视化选项——日历热图。 DHTMLX专注于JavaScript和HTML5 UI小部件和库&#xff0c;以帮助开发人员更快地构…

爬虫相关知识与面试题目

常见的反爬虫和应对方法 参考:https://www.cnblogs.com/bsdr/p/5151891.html 0x01 常见的反爬虫 这几天在爬一个网站&#xff0c;网站做了很多反爬虫工作&#xff0c;爬起来有些艰难&#xff0c;花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的…

python selenium.webdriver 爬取政策文件

文章目录 获取文章链接批量爬取政策文件应用selenium爬取文件信息数据处理导出为excel 获取文章链接 获取中央人民政府网站链接&#xff0c;进入国务院政策文件库&#xff0c;分为国务院文件和部门文件&#xff08;发改委、工信部、交通运输部、市场监督局、商务部等&#xff…

uni.app开发小程序如何获取当前经纬度、位置信息以及如何重新发起授权定位

uni.app开发小程序如何获取当前经纬度、位置信息以及如何重新发起授权定位 前提 先去微信小程序后台申请 wx.getLocation接口1.引入下载的高德小程序SDK2.data中定义所需变量3.onLoad中获取实例 并调用获取经纬度 位置方法4.定义获取定位经纬度 位置信息方法5.用户拒绝授权后,可…

架构训练营学习笔记3-5:消息队列备选架构设计实战

本文属于架构训练营学习笔记系列&#xff1a;模块3的案例讲解 总的来说&#xff0c;这篇从更高的维度去讲&#xff0c;而不是关注消息队列的常见问题&#xff1a;比如消息如何发送&#xff0c;消息如何不丢失 &#xff0c;消息如何不重复。总体上分为2部分&#xff1a;利益干系…

数据可视化:揭开数据的视觉奇迹

随着大数据时代的到来&#xff0c;我们面临着海量的数据&#xff0c;如何从中获取有价值的信息成为一项重要的挑战。数据可视化作为一种强大的工具&#xff0c;通过图表、图形和交互界面&#xff0c;将数据转化为可视化的形式&#xff0c;帮助我们更好地理解和分析数据。 数据可…

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

kafka(一)

一&#xff1a;kafka架构介绍 1. Brokers kafka集群包括一个或者多个服务器&#xff0c;服务器的节点叫做broker。 2. Topic 类似于数据库中的table。物理上不通的topic会分开存储。一个topic的消息会存储在多个broker上。但是在读取的时候&#xff0c;只要选择好topic&…

autok3s k3d rancher研究

参考 功能介绍 | Rancher文档AutoK3s 是用于简化 K3s 集群管理的轻量级工具&#xff0c;您可以使用 AutoK3s 在任何地方运行 K3s 服务。http://docs.rancher.cn/docs/k3s/autok3s/_index 什么是 AutoK3s k3s是经过完全认证的 Kubernetes 产品&#xff0c;在某些情况下可以替…

Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

vue 限制表情输入

在main.js中加入下列代码 import emoji from ./util/emojiVue.directive(emoji,emoji) 在util文件夹中加入emoji.js 下列代码 const findEle (parent, type) > { return parent.tagName.toLowerCase() type ? parent : parent.querySelector(type)}const emoji {bi…

小程序MobX创建store并实现全局数据共享

查看小程序根目录中是否存在package.json文件 在项目根目录运行cmd 没有package.json文件输入npm init -y初始化一下,初始化一个包管理 安装MobX npm install --save mobx-miniprogram4.13.2 mobx-miniprogram-bindings1.2.1 小程序菜单栏工具–构建npm 根目录创建store文…