Flask简介与简单项目操作流程

Flask框架简介


Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用Werkzeug(路由模块),模板引擎则使用Jinja2。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
总结1:Flask也是一款MVC框架

总结2:核心为Werkzeug,这是由python语言编写的遵守WSGI协议的一个包


  • Flask是一款MVC框架,主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识,通过完成作者-读书功能,先来熟悉Flask框架的完整使用步骤。
  • 操作步骤为:
    • 1.创建项目
    • 2.配置数据库
    • 3.定义模型类
    • 4.定义视图并配置URL
    • 5.定义模板


环境安装

  • 使用虚拟环境安装Flask,可以避免包的混乱和版本的冲突,虚拟环境是Python解释器的副本,在虚拟环境中你可以安装扩展包,为每个程序单独创建的虚拟环境,可以保证程序只能访问虚拟环境中的包。而不会影响系统中安装的全局Python解释器,从而保证全局解释器的整洁。
  • 注意:Werkzeug对python3的支持并不好,所以如果使用Flask框架推荐使用python2
  • 虚拟环境使用virtualenv创建,可以查看系统是否安装了virtualenv:

    virtualenv --version
    
  • 运行如下命令安装虚拟环境的应用

sudo pip install virtualenv
sudo pip install virtualenvwrapper
  • 如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh# 3、运行
source ~/.bashrc
  • 创建虚拟环境(ubuntu里须在联网状态下)
mkvirtualenv Flask_py
  • 进入虚拟环境
workon Flask_py
  • 退出虚拟环境
deactivate Flask_py
  • 在虚拟环境中使用pip命令安装Flask包
$ pip install flask==0.10.1

1、创建项目

  • 在pycharm点击菜单File->New Project..
  • .

创建项目

  • 在弹出的New Project窗口中,选择项目类型为Flask,在Location中填写项目路径,在Interpreter中选择上一节创建的虚拟环境,然后点击create按钮

创建项目

  • 在弹出的Open Project窗口中选择打开的方式,可以在新窗口,也可以在当前窗口,选择后点击ok按钮

创建项目

  • 项目创建完成,在pycharm的project面板显示目录结构如下图

创建项目

  • 文件名称与项目名称一致,当前为test1.py
  • 目录static用于存放静态文件
  • 目录templates用于存放模板文件
  • 点击pycharm右上角的绿色三角可以启动项目,如下图

创建项目

  • 运行效果如下图

创建项目

  • 修改启动代码如下,设置debug=True,再改动代码时服务器会自动重启
if __name__ == '__main__':app.run(debug=True)
  • 关闭服务器后再重新启动就会生效

设计模型

  • 此例中设计作者、图书两个模型类,作者-图书为一对多关系
  • 在mysql中创建数据库test1
create database test1 charset=utf8;

2、配置mysql数据库

  • 安装包flask-mysqldb,用于Flask与mysql交互
pip install MySQL-python==1.2.5
  • 安装包Flask-SQLAlchemy,用于ORM转换
pip install flask-sqlalchemy==2.3.2
  • 打开test1.py文件
  • 引入类SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
  • 在app下面编写数据库配置
#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test1'
#创建数据库对象
db = SQLAlchemy(app)


3、定义模型类

  • 定义类如下

class Author(db.Model):__tablename__ = 'author'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(32), unique=True)def __init__(self, name):self.name = nameclass Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(32), unique=True)author = db.Column(db.Integer, db.ForeignKey('author.id'))def __init__(self, title, author):self.title = titleself.author = author

数据操作

  • 在启动程序中创建表
if __name__ == '__main__':db.create_all()app.run()
  • 继续编写代码,添加示例数据
    db.create_all()author1 = Author('金庸')author2 = Author('琼瑶')db.session.add_all([author1, author2])db.session.commit()book11 = Book('射雕英雄传', author1.id)book12 = Book('天龙八部', author1.id)book13 = Book('雪山飞狐', author1.id)book21 = Book('还珠格格', author2.id)book22 = Book('情深深雨濛濛', author2.id)book23 = Book('梅花三弄', author2.id)db.session.add_all([book11, book12, book13, book21, book22, book23])db.session.commit()app.run()
  • 点击运行启动服务器,此时可以到mysql中查询表和数据,表已经被创建,并且数据也加入成功

编写视图

  • 视图的本质就是函数
  • 打开test1.py
  • 定义函数authorlist,查询所有作者信息
def authorlist():alist = Author.query.all()return '作者列表'
  • 定义函数booklist,接收作者编号,查询指定作者的所有图书
def booklist(aid):blist = Book.query.filter(Book.author == aid)return '指定作者的图书列表'

4、URL配置

  • flask的运行过程与django的过程是一样的,如下图

执行流程图

  • 定义完成视图函数后,需要为函数配置url,才可以通过浏览器请求到这个函数
  • 为authorlist配置url
@app.route('/alist/')
def authorlist():alist = Author.query.all()return '作者列表'
  • 运行服务器,在浏览器中可以查看访问效果,访问作者列表的地址如下
http://127.0.0.1:5000/alist/
  • 为booklist配置url,注意从地址中获取参数
@app.route('/blist/<aid>/')
def booklist(aid):blist = Book.query.filter(Book.author == aid)return '指定作者的图书列表'
  • 访问图书列表的地址如下,其中1表示作者的编号
http://127.0.0.1:5000/blist/1/

5、定义模板

  • 与django一样,html可以当作模板使用,可以编写html、css、js代码,也可以编写模板语言的代码
  • 不同的是flask使用的模板语言名称为jiaja2,这种语言与django模板语言十分相似
  • 在test1.py文件上部引入模板函数
from flask import render_template
  • 修改hello_world函数如下,调用模板
@app.route('/')
def hello_world():return render_template('hello.html')
  • 在templates目录下创建hello.html文件,内容如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>hello flask</h1>
</body>
</html>
  • 在浏览器中请求效果如下图

首页

  • 可以通过函数向模板中传递数据,修改代码如下
@app.route('/')
def hello_world():return render_template('hello.html',title='flask',list1=range(5))
  • 修改模板代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>hello {{ title }}</h1>
<ul>{% for i in list1 %}<li>{{ i }}</li>{% endfor %}
</ul>
</body>
</html>
  • 刷新浏览器,运行效果如下图

首页



作者列表

  • 修改authorlist函数,调用模板
@app.route('/alist/')
def authorlist():alist = Author.query.all()return render_template('alist.html',alist=alist)
  • 编写模板alist.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<ul>{% for author in alist %}<li><a href="/blist/{{ author.id }}/">{{ author.name }}</a></li>{% endfor %}
</ul>
</body>
</html>

图书列表

  • 修改authorlist函数,调用模板
@app.route('/blist/<aid>/')
def booklist(aid):blist = Book.query.filter(Book.author == aid)return render_template('blist.html',blist=blist)
  • 编写模板blist.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<ul>{% for book in blist %}<li>{{ book.title }}--{{ book.author }}</li>{% endfor %}
</ul>
</body>
</html>

  • 本示例完成后效果如下图,在首页中显示所有的作者信息

作者

  • 通过作者链接,可以显示所有的图书信息

图书


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

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

相关文章

LeetCode 1640. 能否连接形成数组(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 arr &#xff0c;数组中的每个整数 互不相同 。 另有一个由整数数组构成的数组 pieces&#xff0c;其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是&#xff0c;不允许 对每个数组 pieces[i]…

python基本知识、数据库、网络、编程等总结

Python语言特性 1 Python的函数参数传递 看两个例子: a 1 def fun(a):a 2 fun(a) print a # 1 a [] def fun(a):a.append(1) fun(a) print a # [1] 所有的变量都可以理解是内存中一个对象的“引用”&#xff0c;或者&#xff0c;也可以看似c中void*的感觉。 通过id来看引…

LeetCode 1641. 统计字典序元音字符串的数目(DP)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n&#xff0c;请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。 字符串 s 按 字典序排列 需要满足&#xff1a;对于所有有效的 i&#xff0c;s[i] 在字母表中的位置总是与 s[i1] 相同或在 s[i1] 之…

LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

文章目录1. 题目2. 解题2.1 二分查找2.2 优先队列贪心1. 题目 给你一个整数数组 heights &#xff0c;表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程&#xff0c;不断向后面的建筑物移动&#xff0c;期间可能会用到砖块或梯子。 当从建筑…

ClickHouse高可用及副本测试

1 概述 ​ 对于默认的分布式表的配置&#xff0c;每个分片只有一份&#xff0c;这种多分片单副本集群&#xff0c;挂掉一个节点的话查询分布式表会报错。为了解决这个问题的话可以使用ClickHouse高可用集群&#xff0c;对于每个分片具有2个或2个以上的副本&#xff0c;当某个节…

阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

秒杀活动是绝大部分电商选择的低价促销&#xff0c;推广品牌的方式。不仅可以给平台带来用户量&#xff0c;还可以提高平台知名度。一个好的秒杀系统&#xff0c;可以提高平台系统的稳定性和公平性&#xff0c;获得更好的用户体验&#xff0c;提升平台的口碑&#xff0c;从而提…

LeetCode 756. 金字塔转换矩阵(回溯)

文章目录1. 题目2. 解题1. 题目 现在&#xff0c;我们用一些方块来堆砌一个金字塔。 每个方块用仅包含一个字母的字符串表示。 使用三元组表示金字塔的堆砌规则如下&#xff1a; 对于三元组(A, B, C) &#xff0c;“C”为顶层方块&#xff0c;方块“A”、“B”分别作为方块“…

Flask框架项目实例:**租房网站(一)

Flask是一款MVC框架&#xff0c;主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识&#xff0c;通过完成作者-读书功能&#xff0c;先来熟悉Flask框架的完整使用步骤。 操作步骤为&#xff1a; 1.创建项目2.配置数据库3.定义模型类4.定义视图并配置URL 5.定义模板…

LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)

文章目录1. 题目2. 解题1. 题目 LC 316&#xff1a; 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 示例 1&#xff1a; 输入&#…

LeetCode 809. 情感丰富的文字

文章目录1. 题目2. 解题1. 题目 有时候人们会用重复写一些字母来表示额外的感受&#xff0c;比如 "hello" -> "heeellooo", "hi" -> "hiii"。 我们将相邻字母都相同的一串字符定义为相同字母组&#xff0c;例如&#xff1a;&qu…

网站部署nginx--uwsgi

网站代码写完之后就是项目部署&#xff0c;主要包括两个方面&#xff1a; 1.nginx安装与配置&#xff1a; 1、Nginx 安装 系统平台&#xff1a;CentOS release 6.6 (Final) 64位。 一、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl open…

天池 在线编程 滑动数独(滑动窗口)

文章目录1. 题目2. 解题1. 题目 描述 给定一个 3xn的矩阵 number&#xff0c;并且该矩阵只含有1到9的正整数。 考虑有一个大小为 3x3 滑动窗口&#xff0c;从左到右遍历该矩阵 number&#xff0c; 那么该滑动窗口在遍历整个矩阵的过程中会有n-2个。 现在你的任务是找出这些滑…

TIGK监控平台介绍

1 概述 众所周知监控平台对大数据平台是非常重要的&#xff0c;监控是故障诊断和分析的重要辅助利器&#xff0c;在发生事故之前就能预警&#xff0c;最大限度降低系统故障率。   监控系统我们可以分为业务层面&#xff0c;应用层面&#xff0c;系统层面 1.1 业务层面 业务系…

天池 在线编程 队列检查(排序)

文章目录1. 题目2. 解题1. 题目 描述 班上的学生根据他们的年级照片的身高升序排列&#xff0c;确定当前未站在正确位置的学生人数 数组长度 < 10^5示例 输入: heights [1,1,3,3,4,1]输出: 3解释: 经过排序后 heights变成了[1,1,1,3,3,4]&#xff0c;有三个学生不在应在…

celery异步执行任务在Django中的应用实例

1. 创建django项目celery_demo, 创建应用demo: django-admin startproject celery_demo python manage.py startapp demo2.在celery_demo模块中创建celery.py模块, 文件目录为: celery.py模块内容为: from celery import Celery from django.conf import settings import os#…

Spring自学教程-注解的使用(三)

一、java中的注解定义注解下面是一个定义注解的实例。Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)DocumentedInheritedpublic interface Description { String value();}其中的interface是一个关键字&#xff0c;在设计annotations的时候必须把一个类型定义为…

Django单元测试

一.前言/准备 测Django的东西仅限于在MTV模型。哪些可以测&#xff1f;哪些不可以。 1.html里的东西不能测。①Html里的HTML代码大部分都是写死的②嵌套在html中的Django模板语言也不能测&#xff0c;即使有部分逻辑。 但写测试用例时至少要调用一个类或者方法。模板语言没有出…

天池 在线编程 中位数

文章目录1. 题目2. 解题1. 题目 描述 给定一个长度为N的整数数组arr 返回一个长度为N的整数答案数组ans ans[i] 表示删除arr数组第i个数后&#xff0c;arr数组的中位数 N为偶数 2 < N < 10^5 示例 输入:[1,2,3,4,5,6] 输出:[4,4,4,3,3,3] 解释:删去1后 剩下的数组为[…

倒排索引原理和实现

关于倒排索引 搜索引擎通常检索的场景是&#xff1a;给定几个关键词&#xff0c;找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型&#xff0c;通过这个模型我们可以很方便知道某篇文档包含哪些关键词&#xff0c;某…

天池 在线编程 Character deletion

文章目录1. 题目2. 解题1. 题目 描述 Enter two strings and delete all characters in the second string from the first string 字符串长度&#xff1a;[1, 10^5] Example 1: Input: str”They are students”&#xff0c;sub”aeiou” Output: ”Thy r stdnts”来源&am…