当前位置:   article > 正文

Flask备忘录_基于flask框架的备忘录程序 功能如下:1. 用户认证 2.用户可以添加要做的事项。 3.

基于flask框架的备忘录程序 功能如下:1. 用户认证 2.用户可以添加要做的事项。 3.

此文仅仅作为学习本人Flask途中的学习笔记以及备忘录!!!!!

代码格式粘贴复制可能格式出错emm,自己知道就好了!!

无图,慢慢看!!挺枯燥的学习笔记,做个网络备份!!!

目录

一.服务架构:

二.Flask是什么?

01. 微框架

02. 特点

03. 组成

04.常用库:

三.Flask环境搭建:

01.Windows虚拟环境直接上:

02.Conda环境:

03.Linux环境:

四.Flask工程实践:

01.万物之源Hello World:

02.请求处理:

03.JinJa2模板:

04.错误自定义:

05.静态文件:

06.Web表单:

07.数据库

08.电子邮件

09. 工厂函数:

10. 蓝图

11. 大型项目结构:

12. 项目部署:

五. 前后端分离:

01.为什么要前后端分离:

02.什么是前后端分离:

六.快速博客搭建:

01.安装bt

02.bt功能:

03.访问宝塔页面

七.实际项目:

八.项目实践:

九.Flask漏洞:

01.XSS(跨站脚本攻击):

02.CSRF(跨站请求伪造):

03.Secret key

04.SSTI

十.参考文章:


大家好,又见面了,经过前段时间的前端三剑客的学习,大家是否对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之类的软件进行测试以及纠错!

一.服务架构:

先给大家科普一下一些常识:

  1. - B/S:浏览器/服务器架构(客户端需要更新才行)
  2. - C/S:客户端/服务器架构(刷新页面即可更新)(主流)(尤其是H5时代的到来)

CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难度较大。通常只局限于小型局域网,不利于扩展。并且,由于该结构的每台客户机都需要安装相应的客户端程序,分布功能弱且兼容性差,不能实现快速部署安装和配置,因此缺少通用性,具有较大的局限性。要求具有一定专业水准的技术人员去完成。

BS即Browser/Server(浏览器/服务器)结构,就是只安装维护一个服务器(Server),而客户端采用浏览器(Browse)运行软件。B/S结构应用程序相对于传统的C/S结构应用程序是一个非常大的进步。 B/S结构的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,这些缺点是有目共睹的,难以实现传统模式下的特殊功能要求。例如通过浏览器进行大量的数据输入或进行报表的应答、专用性打印输出都比较困难和不便。此外,实现复杂的应用构造有较大的困难。

二.Flask是什么?

01. 微框架

Flask是一个微框架,什么叫做微框架呢?它并不是去掉了啥Web功能,或是叫你把所有Web应用放在一个py文件里面去执行,(可以但没必要hh),本身Flask提供了最基础最核心的功能,其余的拓展功能并不直接替你决策。如使用哪种数据库之类的,这些都是由开发者掌握,简而言之,Flask框架是一个DIY的框架,你可以在上面玩出各种花样!flask框架小,不代表着它的功能少!

并且它也是可以在复杂的生产环境中投入使用的!

Flask更多是和优秀的轮子结合,使得它更加灵活以及强大,可玩性更强!配置选项众多,但都设置了一些合理的默认值,使你不用过于担心安全问题!

02. 特点

  • Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过

  • Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库

  • 入门简单,即便没有多少web开发经验,也能很快做出网站

  • 非常适用于小型网站

  • 非常适用于开发web服务的API

  • 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验

  • 各方面性能均等于或优于Django

  • Django自带的或第三方的好评如潮的功能,Flask上总会找到与之类似第三方库

  • Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django

  • Flask比Django更加Pythonic,与Python的philosophy更加吻合

03. 组成

Flask核心有三个主要依赖:路由、调试和Web服务器网关接口(WSGI,Web server gateway interface),子系统是由Werkzeug提供,模板系统由Jinja2提供,命令行集成是由Click提供。

原生flask不支持数据库访问、Web表单验证和用户身份验证等高级功能。这些绝大多数web应用需要的核心服务都以拓展的形式实现,然后再与核心包集成。

开发者可以自由挑选符合项目需求的拓展,甚至可以自行开发。

04.常用库:

单单只有Flask还是远远不够的!这时候你就要把目光放在那些强大的Flask库上,下面就是我们常用的库的列表,内容不完整,仅供参考:

  • flask-script

    为Flask提供强大的命令行操作,与Django shell类似。

  • flask-login

    Flask user session 管理,提供诸如login_user, logout_user, login_required, current_user等功能,也是其他很多Flask库的基础。

  • flask-admin

    为Flask应用提供操作简单且易于扩展的数据库管理界面,与Django自带的数据库管理app类似。

  • Flask-WTF

    Flask与WTForms的集成,提供强大的Form安全和校验机制,与Django内置的Form功能类似。

  • flask-principal

    Flask强大的权限管理机制,灵活性强,提供了一个权限管理的基础框架,是很多Flask权限相关扩展的基础。

  • flask-restful

    一个强大的Flask RESTful框架,简单好用。

  • flask-api

    相当于Django REST Framework的Flask版,是另一个强大的Flask RESTful框架。

  • Flask-Mail

    Flask-Mail 为Flask应用添加了SMTP 邮件发送功能

  • Flask-User

    Flask-User集成了用户管理相关功能,并允许对功能做定制性修改,其相关功能包括Register, Confirm email, Login, Change username, Change password, Forgot password等。

    Flask-User 基于Flask-SQLAlchemy,NoSQL数据库无法使用。

  • flask-security

    Flask-Security让开发者能够很快的为应用添加常用的安全机制,其整合了Flask-Login, Flask-Mail, Flask-Principal, Flask-Script等应用。

  • flask-babel

    Flask国际化和本地化扩展,基于Babel

  • flask-locale

    为Flask应用添加语言包,与flask-babel类似。

三.Flask环境搭建:

01.Windows虚拟环境直接上:

额,实质上Flask就是python写的一个拓展包,直接下载它就是了!!

我们现在Windows完成开发,再将代码打包至服务器上进行生产环境的实现。

好,现在打开我们的Pycharm

然后点击终端,进行Flask的下载

pip install flask

直接下载,好了,环境就搭好了,快不快?

一般来说,我们都是在Windows环境下进行开发,然后项目打包至云服务器上进行部署。

02.Conda环境:

如果你之前装了conda,那也可以直接输入下面的命令:

conda create --name flask python=3.9

使用PyCharm创建一个名为flask-demo的项目,并选择我们刚才创建的python环境。

然后Flask实质上是python的一个包,和你们之前用的pandas,numpy之类的都差不多!

03.Linux环境:

1. 虚拟环境:

  • 在标准库中没有venv这个包,需要执行以下命令安装python3-venv

sudo apt-get install python3-venv
  • 创建虚拟环境的命令模式如下:

  1. python3 -m venv virtual-environment-name
  2. # -m venv 选项的作用是以独立的脚本运行标准库中的venv包,后面的参数是虚拟环境的名称。
  3. # 确保当前目录是在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 

四.Flask工程实践:

01.万物之源Hello World:

然后我们直接新建一个py文件,命名为app.py

然后将下面这一段代码直接给输进去

先不要管什么含义,先输进去再说!!

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return '<h1>Hello World</h1>'
  6. if __name__ == "__main__":
  7. app.run(port=80)

输入,然后运行,

运行你可以直接正常运行Shift+Ctrl+F10或者是在终端里面进行输入:

flask run

值得注意的是,你首先要指定环境变量:

  1. export FLASK_APP=app.py
  2. flask run

更多详情可以在终端输入:查看

flask run --help
  1. (venv) C:\Users\jiang'xiao\PycharmProjects\pythonProject1213>flask run --help
  2. Usage: flask run [OPTIONS]
  3. Run a local development server.
  4. This server is for development purposes only. It does not provide the
  5. stability, security, or performance of production WSGI servers.
  6. The reloader and debugger are enabled by default if FLASK_ENV=development or
  7. FLASK_DEBUG=1.
  8. Options:
  9. -h, --host TEXT The interface to bind to.
  10. -p, --port INTEGER The port to bind to.
  11. --cert PATH Specify a certificate file to use HTTPS.
  12. --key FILE The key file to use when specifying a
  13. certificate.
  14. --reload / --no-reload Enable or disable the reloader. By default
  15. the reloader is active if debug is enabled.
  16. --debugger / --no-debugger Enable or disable the debugger. By default
  17. the debugger is active if debug is enabled.
  18. --eager-loading / --lazy-loading
  19. Enable or disable eager loading. By default
  20. eager loading is enabled if the reloader is
  21. disabled.
  22. --with-threads / --without-threads
  23. Enable or disable multithreading.
  24. --extra-files PATH Extra files that trigger a reload on change.
  25. Multiple paths are separated by ';'.
  26. --help Show this message and exit.

出现这个内容,点击蓝色的链接,进行访问:( Ctrl + C 可以停止这个服务,你也可以点击关闭按钮!!)

5DghFS.png

进行访问:

看,你就看到了一个大大的Hello World!!!

尝试修改一下里面的东西,然后来看看有什么变动!

Hello World

这里要注意:run的方法参数:

IPZNb6.png

你可以这样子加上去!

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return '<h1>Hello World</h1>'
  6. if __name__ == "__main__":
  7. app.run(port=80,debug=True) #看这里!!!!

以逗号隔开即可!!!

我们来解读一下源码的结构:

1.初始化:

所有 Flask 应用都必须创建一个应用实例。Web 服务器使用一种名为 Web 服务器网关接口(WSGI,Web server gateway interface,读作“wiz-ghee”)的协议,把接收自客户端的所有请求都转交给这个对象处理。应用实例是 Flask 类的对象,通常由下述代码创建:

  1. from flask import Flask
  2. app = Flask(__name__)

Flask 类的构造函数只有一个必须指定的参数,即应用主模块或包的名称。在大多数应用

中,Python 的 name 变量就是所需的值。

2.路由初始化:

客户端(例如 Web 浏览器)把请求发送给 Web 服务器,Web 服务器再把请求发送给 Flask应用实例。应用实例需要知道对每个 URL 的请求要运行哪些代码,所以保存了一个 URL到 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由。 在 Flask 应用中定义路由的最简便方式,是使用应用实例提供的 app.route 装饰器。

下面的例子说明了如何使用这个装饰器声明路由:

  1. @app.route('/')
  2. def index():
  3. return '<h1>Hello World!</h1>'

下面这种方法了解即可,实际上我们并不常用:

前例把 index() 函数注册为应用根地址的处理程序。使用 app.route 装饰器注册视图函数是首选方法,但不是唯一的方法。Flask 还支持一种更传统的方式:使用 app.add_url_rule() 方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。下述示例使用 app.add_url_rule() 方法注册 index() 函数,其作用与前例相同:

  1. def index():
  2. return '<h1>Hello World!</h1>'
  3. app.add_url_rule('/', 'index', index)

index():

这个叫做视图函数,这个函数的返回值就是响应,是客户端接收到的内容,可以是HTML的字符串或者是表单!!

3.可变参数(动态路由):

只需要在app.route装饰器中使用特殊的句法即可!!

  1. @app.route('/user/<name>')
  2. def user(name):
  3. return '<h1>Hello, {}!</h1>'.format(name)

路由 URL 中放在尖括号里的内容就是动态部分,任何能匹配静态部分的 URL 都会映射到这个路由上。调用视图函数时,Flask 会将动态部分作为参数传入函数。在这个视图函数中,name 参数用于生成个性化的欢迎消息。

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return '<h1>Hello World</h1>'
  6. @app.route('/<name>')
  7. def user(name):
  8. return '<h1>Hello, {}!</h1>'.format(name)
  9. if __name__ == "__main__":
  10. app.run(port=5000)

IkQKbQ.png

没有骂人!没有骂人!没有骂人!求生欲极强!!!

路由中的动态部分默认使用字符串,不过也可以是其他类型。例如,路由 /user/<int:id>只会匹配动态片段 id 为整数的 URL,例如 /user/123。Flask 支持在路由中使用 string、int、float 和 path 类型。path 类型是一种特殊的字符串,与 string 类型不同的是,它可以包含正斜线。

02.请求处理:

上面这个十分简单,但又是后面一切一切的基础,要知道,在Web服务里有个关键的地方就是对请求的处理!

如果你对HTTP有所学习,有所了解,那你应该知道常见的请求类型方法有如下几种:

5bvbKe.png

其实我们也是可以自定义方法进行访问的,比如说以helloworld的方法进行访问,只不过现在要统一访问的方法!!

Flask允许我们指定某个请求可以通过哪些类型进行访问。可以在路由装饰器中传入methods需要的参数,该参数是一个列表,如只允许GET请求,可以设置methods=[‘GET’],如允许GET和POST,可以设置methods=[‘GET’,‘POST’]。如设置下面/methods这个路由只允GET请求类型的访问。

这时候你就可以用Postman来进行基本的测试操作了!什么?你还没有装postman??

  1. @app.route("/methods", methods=["GET"])
  2. def methods():
  3. return "Only allow GET request types"

1.请求与相应循环:

客户端向Flask发送请求时,要让视图函数访问一些对象,这样才能处理请求。并且在Flask中它使用上下文临时把某些对象变为全局可访问。

  1. from flask import Flask
  2. from flask import request
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. user_agent = request.headers.get('User-Agent')
  7. return '<p>Your browser is {}</p>'.format(user_agent)
  8. if __name__ == "__main__":
  9. app.run(port=80)

5OFzRJ.png

你的User-Agent就这样打印在html页面上了!!

如果你有学习过Http报文的基本格式,你就知道这个是什么了!!

详情请见:

03.JinJa2模板:

1. 模板位置:

模板是包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask 使用一个名为 Jinja2 的强大模板引擎。

示例:

  1. <h1>Hello, {
  2. { name }}!</h1>

任何模板,在Flask里面,它都是默认从templates里面取,要是你想要自定义,你就得另外加代码!!为了简便,我们就直接在这里新建个templates文件夹,然后创建一个index.html。

5OVAoV.png

然后我们记得引入render_template这个包

  1. from flask import Flask, render_template
  2. import requests
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. return '<h1>Hello World!!</h1>'
  7. @app.route('/<name>')
  8. def user(name):
  9. return render_template('index.html', name=name)
  10. if __name__ == "__main__":
  11. app.run(port=80)

5OVBwt.png

简而易见,Jinja2模板里面表示变量的格式为 { {}}

2. 过滤器:

还可以通过过滤器进行修改变量值比如:

  1. Hello, {
  2. { name|capitalize }}

将name这个变量的值变成首字母大写的形式

中间用那个熟悉的管道符 | 来隔开,虽然这里并不是管道符的作用hh

  1. safe 渲染值时不转义
  2. capitalize 把值的首字母转换成大写,其他字母转换成小写
  3. lower 把值转换成小写形式
  4. upper 把值转换成大写形式
  5. title 把值中每个单词的首字母都转换成大写
  6. trim 把值的首尾空格删掉
  7. striptags 渲染之前把值中所有的 HTML 标签都删掉

注意一点,以后写Flask项目,乃至写任何项目,或是你工作,要记住一点,千万不要相信用户写的值!!!这里的safe过滤器要慎用!!

过滤器详情,请访问:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/811120
推荐阅读
相关标签
  

闽ICP备14008679号