赞
踩
此文仅仅作为学习本人Flask途中的学习笔记以及备忘录!!!!!
代码格式粘贴复制可能格式出错emm,自己知道就好了!!
无图,慢慢看!!挺枯燥的学习笔记,做个网络备份!!!
目录
大家好,又见面了,经过前段时间的前端三剑客的学习,大家是否对Web有更深入的了解呢?是否自己能做一个美观大方的静态网站?或者有没有自己尝试着用JS做一些小玩意,诸如小时钟啥的,hh,没有也无所谓,这节课过后你们可以继续去学。不过这节课我们就来讲一些后端的东西吧!!!
由于你们之前学过Python,那我就直接以Python作为入门的后端语言,以它的轻量级框架——Flask作为大家伙们的后端入门框架!!!
来一起看看吧!!
important:需要注意的是,我们需要先下载一款软件叫做Postman,这个在你们以后学习乃至测试,实验都会用到!
官网地址:Download Postman | Get Started for Free
百度网盘地址:链接:百度网盘 请输入提取码 提取码:8bhl
比邻网盘:https://pan.bilnn.com/api/v3/file/sourcejump/P8NmyAUO/ZMYsRskBx_Pb-1mRV5is9jBthgWkHAwaU3b1jjVHc90*
比邻网盘记得带个*号!!
尤其是前后端接口的测试,可以使用诸如postman之类的软件进行测试以及纠错!
先给大家科普一下一些常识:
- - B/S:浏览器/服务器架构(客户端需要更新才行)
- - C/S:客户端/服务器架构(刷新页面即可更新)(主流)(尤其是H5时代的到来)
CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难度较大。通常只局限于小型局域网,不利于扩展。并且,由于该结构的每台客户机都需要安装相应的客户端程序,分布功能弱且兼容性差,不能实现快速部署安装和配置,因此缺少通用性,具有较大的局限性。要求具有一定专业水准的技术人员去完成。
BS即Browser/Server(浏览器/服务器)结构,就是只安装维护一个服务器(Server),而客户端采用浏览器(Browse)运行软件。B/S结构应用程序相对于传统的C/S结构应用程序是一个非常大的进步。 B/S结构的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,这些缺点是有目共睹的,难以实现传统模式下的特殊功能要求。例如通过浏览器进行大量的数据输入或进行报表的应答、专用性打印输出都比较困难和不便。此外,实现复杂的应用构造有较大的困难。
Flask是一个微框架,什么叫做微框架呢?它并不是去掉了啥Web功能,或是叫你把所有Web应用放在一个py文件里面去执行,(可以但没必要hh),本身Flask提供了最基础最核心的功能,其余的拓展功能并不直接替你决策。如使用哪种数据库之类的,这些都是由开发者掌握,简而言之,Flask框架是一个DIY的框架,你可以在上面玩出各种花样!flask框架小,不代表着它的功能少!
并且它也是可以在复杂的生产环境中投入使用的!
Flask更多是和优秀的轮子结合,使得它更加灵活以及强大,可玩性更强!配置选项众多,但都设置了一些合理的默认值,使你不用过于担心安全问题!
Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过
Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库
入门简单,即便没有多少web开发经验,也能很快做出网站
非常适用于小型网站
非常适用于开发web服务的API
开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
各方面性能均等于或优于Django
Django自带的或第三方的好评如潮的功能,Flask上总会找到与之类似第三方库
Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django
Flask比Django更加Pythonic,与Python的philosophy更加吻合
Flask核心有三个主要依赖:路由、调试和Web服务器网关接口(WSGI,Web server gateway interface),子系统是由Werkzeug提供,模板系统由Jinja2提供,命令行集成是由Click提供。
原生flask不支持数据库访问、Web表单验证和用户身份验证等高级功能。这些绝大多数web应用需要的核心服务都以拓展的形式实现,然后再与核心包集成。
开发者可以自由挑选符合项目需求的拓展,甚至可以自行开发。
单单只有Flask还是远远不够的!这时候你就要把目光放在那些强大的Flask库上,下面就是我们常用的库的列表,内容不完整,仅供参考:
为Flask提供强大的命令行操作,与Django shell类似。
Flask user session 管理,提供诸如login_user
, logout_user
, login_required
, current_user
等功能,也是其他很多Flask库的基础。
为Flask应用提供操作简单且易于扩展的数据库管理界面,与Django自带的数据库管理app类似。
Flask与WTForms的集成,提供强大的Form安全和校验机制,与Django内置的Form功能类似。
Flask强大的权限管理机制,灵活性强,提供了一个权限管理的基础框架,是很多Flask权限相关扩展的基础。
一个强大的Flask RESTful框架,简单好用。
相当于Django REST Framework的Flask版,是另一个强大的Flask RESTful框架。
Flask-Mail 为Flask应用添加了SMTP 邮件发送功能
Flask-User集成了用户管理相关功能,并允许对功能做定制性修改,其相关功能包括Register, Confirm email, Login, Change username, Change password, Forgot password等。
Flask-User 基于Flask-SQLAlchemy
,NoSQL数据库无法使用。
Flask-Security让开发者能够很快的为应用添加常用的安全机制,其整合了Flask-Login
, Flask-Mail
, Flask-Principal
, Flask-Script
等应用。
Flask国际化和本地化扩展,基于Babel
为Flask应用添加语言包,与flask-babel
类似。
额,实质上Flask就是python写的一个拓展包,直接下载它就是了!!
我们现在Windows完成开发,再将代码打包至服务器上进行生产环境的实现。
好,现在打开我们的Pycharm
然后点击终端,进行Flask的下载
pip install flask
直接下载,好了,环境就搭好了,快不快?
一般来说,我们都是在Windows环境下进行开发,然后项目打包至云服务器上进行部署。
如果你之前装了conda,那也可以直接输入下面的命令:
conda create --name flask python=3.9
使用PyCharm创建一个名为flask-demo的项目,并选择我们刚才创建的python环境。
然后Flask实质上是python的一个包,和你们之前用的pandas,numpy之类的都差不多!
1. 虚拟环境:
在标准库中没有venv这个包,需要执行以下命令安装python3-venv
sudo apt-get install python3-venv
创建虚拟环境的命令模式如下:
- python3 -m venv virtual-environment-name
- # -m venv 选项的作用是以独立的脚本运行标准库中的venv包,后面的参数是虚拟环境的名称。
- # 确保当前目录是在flasky
python3 -m venv venv
执行上面的命令之后,会出现一个名为venv的子目录,这里就是全新的虚拟环境,包含这个项目专用的Python解释器。
使用虚拟环境 如果要想使用虚拟环境,首先要先激活虚拟环境,可以使用下面的命令激活虚拟环境
source venv/bin/activate
当然,你聪明的大脑应该可以相出退出虚拟环境的命令:
source venv/bin/deactivate
如果使用的是为微软windows系统,激活命令是:
venv\Scripts\activate
使用pip安装Python包 Python通过包管理器pip安装,所有的虚拟环境都是使用这个工具。
若想要在虚拟环境中安装flask,要确保venv虚拟环境已经激活,然后执行下面命令
(venv) $ pip install flask
然后我们直接新建一个py文件,命名为app.py
然后将下面这一段代码直接给输进去
先不要管什么含义,先输进去再说!!
- from flask import Flask
-
- app = Flask(__name__)
-
- @app.route('/')
- def index():
- return '<h1>Hello World</h1>'
-
- if __name__ == "__main__":
- app.run(port=80)
输入,然后运行,
运行你可以直接正常运行Shift+Ctrl+F10
或者是在终端里面进行输入:
flask run
值得注意的是,你首先要指定环境变量:
- export FLASK_APP=app.py
- flask run
更多详情可以在终端输入:查看
flask run --help
- (venv) C:\Users\jiang'xiao\PycharmProjects\pythonProject1213>flask run --help
- Usage: flask run [OPTIONS]
- Run a local development server.
- This server is for development purposes only. It does not provide the
- stability, security, or performance of production WSGI servers.
- The reloader and debugger are enabled by default if FLASK_ENV=development or
- FLASK_DEBUG=1.
-
- Options:
- -h, --host TEXT The interface to bind to.
- -p, --port INTEGER The port to bind to.
- --cert PATH Specify a certificate file to use HTTPS.
- --key FILE The key file to use when specifying a
- certificate.
- --reload / --no-reload Enable or disable the reloader. By default
- the reloader is active if debug is enabled.
- --debugger / --no-debugger Enable or disable the debugger. By default
- the debugger is active if debug is enabled.
- --eager-loading / --lazy-loading
- Enable or disable eager loading. By default
- eager loading is enabled if the reloader is
- disabled.
- --with-threads / --without-threads
- Enable or disable multithreading.
- --extra-files PATH Extra files that trigger a reload on change.
- Multiple paths are separated by ';'.
- --help Show this message and exit.
出现这个内容,点击蓝色的链接,进行访问:( Ctrl + C 可以停止这个服务,你也可以点击关闭按钮!!)
进行访问:
看,你就看到了一个大大的Hello World!!!
尝试修改一下里面的东西,然后来看看有什么变动!
Hello World
这里要注意:run的方法参数:
你可以这样子加上去!
- from flask import Flask
-
- app = Flask(__name__)
-
- @app.route('/')
- def index():
- return '<h1>Hello World</h1>'
-
- if __name__ == "__main__":
- app.run(port=80,debug=True) #看这里!!!!
以逗号隔开即可!!!
我们来解读一下源码的结构:
1.初始化:
所有 Flask 应用都必须创建一个应用实例。Web 服务器使用一种名为 Web 服务器网关接口(WSGI,Web server gateway interface,读作“wiz-ghee”)的协议,把接收自客户端的所有请求都转交给这个对象处理。应用实例是 Flask 类的对象,通常由下述代码创建:
- from flask import Flask
-
- app = Flask(__name__)
Flask 类的构造函数只有一个必须指定的参数,即应用主模块或包的名称。在大多数应用
中,Python 的 name 变量就是所需的值。
2.路由初始化:
客户端(例如 Web 浏览器)把请求发送给 Web 服务器,Web 服务器再把请求发送给 Flask应用实例。应用实例需要知道对每个 URL 的请求要运行哪些代码,所以保存了一个 URL到 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由。 在 Flask 应用中定义路由的最简便方式,是使用应用实例提供的 app.route 装饰器。
下面的例子说明了如何使用这个装饰器声明路由:
- @app.route('/')
- def index():
- return '<h1>Hello World!</h1>'
下面这种方法了解即可,实际上我们并不常用:
前例把 index() 函数注册为应用根地址的处理程序。使用 app.route 装饰器注册视图函数是首选方法,但不是唯一的方法。Flask 还支持一种更传统的方式:使用 app.add_url_rule() 方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。下述示例使用 app.add_url_rule() 方法注册 index() 函数,其作用与前例相同:
- def index():
- return '<h1>Hello World!</h1>'
- app.add_url_rule('/', 'index', index)
index():
这个叫做视图函数,这个函数的返回值就是响应,是客户端接收到的内容,可以是HTML的字符串或者是表单!!
3.可变参数(动态路由):
只需要在app.route装饰器中使用特殊的句法即可!!
- @app.route('/user/<name>')
- def user(name):
- return '<h1>Hello, {}!</h1>'.format(name)
路由 URL 中放在尖括号里的内容就是动态部分,任何能匹配静态部分的 URL 都会映射到这个路由上。调用视图函数时,Flask 会将动态部分作为参数传入函数。在这个视图函数中,name 参数用于生成个性化的欢迎消息。
- from flask import Flask
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- return '<h1>Hello World</h1>'
-
- @app.route('/<name>')
- def user(name):
- return '<h1>Hello, {}!</h1>'.format(name)
-
- if __name__ == "__main__":
- app.run(port=5000)
没有骂人!没有骂人!没有骂人!求生欲极强!!!
路由中的动态部分默认使用字符串,不过也可以是其他类型。例如,路由 /user/<int:id>只会匹配动态片段 id 为整数的 URL,例如 /user/123。Flask 支持在路由中使用 string、int、float 和 path 类型。path 类型是一种特殊的字符串,与 string 类型不同的是,它可以包含正斜线。
上面这个十分简单,但又是后面一切一切的基础,要知道,在Web服务里有个关键的地方就是对请求的处理!
如果你对HTTP有所学习,有所了解,那你应该知道常见的请求类型方法有如下几种:
其实我们也是可以自定义方法进行访问的,比如说以helloworld的方法进行访问,只不过现在要统一访问的方法!!
Flask允许我们指定某个请求可以通过哪些类型进行访问。可以在路由装饰器中传入methods需要的参数,该参数是一个列表,如只允许GET请求,可以设置methods=[‘GET’],如允许GET和POST,可以设置methods=[‘GET’,‘POST’]。如设置下面/methods这个路由只允GET请求类型的访问。
这时候你就可以用Postman来进行基本的测试操作了!什么?你还没有装postman??
- @app.route("/methods", methods=["GET"])
- def methods():
- return "Only allow GET request types"
1.请求与相应循环:
客户端向Flask发送请求时,要让视图函数访问一些对象,这样才能处理请求。并且在Flask中它使用上下文临时把某些对象变为全局可访问。
- from flask import Flask
- from flask import request
-
- app = Flask(__name__)
-
- @app.route('/')
- def index():
- user_agent = request.headers.get('User-Agent')
- return '<p>Your browser is {}</p>'.format(user_agent)
-
- if __name__ == "__main__":
- app.run(port=80)
你的User-Agent就这样打印在html页面上了!!
如果你有学习过Http报文的基本格式,你就知道这个是什么了!!
详情请见:
1. 模板位置:
模板是包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask 使用一个名为 Jinja2 的强大模板引擎。
示例:
- <h1>Hello, {
- { name }}!</h1>
任何模板,在Flask里面,它都是默认从templates里面取,要是你想要自定义,你就得另外加代码!!为了简便,我们就直接在这里新建个templates文件夹,然后创建一个index.html。
然后我们记得引入render_template这个包
- from flask import Flask, render_template
- import requests
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- return '<h1>Hello World!!</h1>'
-
-
- @app.route('/<name>')
- def user(name):
- return render_template('index.html', name=name)
-
-
- if __name__ == "__main__":
- app.run(port=80)
简而易见,Jinja2模板里面表示变量的格式为 {
{}}
2. 过滤器:
还可以通过过滤器进行修改变量值比如:
- Hello, {
- { name|capitalize }}
将name这个变量的值变成首字母大写的形式
中间用那个熟悉的管道符 | 来隔开,虽然这里并不是管道符的作用hh
- safe 渲染值时不转义
- capitalize 把值的首字母转换成大写,其他字母转换成小写
- lower 把值转换成小写形式
- upper 把值转换成大写形式
- title 把值中每个单词的首字母都转换成大写
- trim 把值的首尾空格删掉
- striptags 渲染之前把值中所有的 HTML 标签都删掉
注意一点,以后写Flask项目,乃至写任何项目,或是你工作,要记住一点,千万不要相信用户写的值!!!这里的safe过滤器要慎用!!
过滤器详情,请访问:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。