Flask项目之手机端租房网站的实战开发(四)

news/2024/5/20 15:47:48/文章来源:https://blog.csdn.net/weixin_30544657/article/details/95149313

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/85676643

目录

一丶在项目中添加静态资源文件

二丶关于csrf防护机制

三丶用户注册模块(图片验证码以及短信验证码)

四丶测试后端verify_code接口是否正确


一丶在项目中添加静态资源文件

1.将静态资源文件拷贝到项目static目录下

2.在终端上运行项目python manage.py runserver

3.在浏览器中输入http://127.0.0.1:5000/static/html/index.html 访问前端主页,如下图

4.当在不使用nginx服务器给用户提供静态资源,而是以flask来提供,当用户在浏览器中输入/static/html/index.html就会显得不友好,正常来说访问主页只需要输入ip地址或者是域名加端口号就可以了,那么就需要我们专门写个视图函数来提供有好的链接地址,把地址前缀给去掉

5.创建一个蓝图,专门负责提供静态文件的

  • step1 在ihome目录下创建一个web_html.py文件
  • step2 创建蓝图html
html = Blueprint("web_html", __name__)
  • step3 在utils目录下创建一个__init__.py文件,使这个目录变成python的包,然后在这个utils包中创建commons.py文件,作为通用工具,在里面定义一个正则转换器

  • step4 在ihome/init文件中,在创建app对象时候,将ReConverter对象添加到app中

  • step5 回到commons.py文件中,定义视图函数get_html

  • step6 在ihome/init中进入此蓝图注册

  • step7 启动项目
python manage.py runserver
  • step8 清除网页缓存数据

  • step9 在浏览器地址栏输入http://127.0.0.1:5000/就直接跳转到主页了index.html了

  •  step10 输入http://127.0.0.1:5000/register.html也是没有问题的,直接跳转到register.html

 二丶关于csrf防护机制

1.csrf验证机制:从cookie中获取一个csrf_token的值,再从请求体中获取一个csrf_token的值,如果这两个值相同,则检
验通过,可以进入视图函数中执行,如果两个值不同,则检验失败,会想前端返回状态码404的错,之前在ihome/init中设置的csrf只是负责验证,并不负责cookie与请求体中的csrf_token的值从哪里来

    # 为flask补充csrf防护CSRFProtect(app)

2.分析:前后端不分离时跟django一样直接在模板中进行设置csrf,而我们这个项目使用的是前后端分离,没有模板,对于cookie我们可以提前进行设置csrf_token,然后对于请求体中的cookie而言,当 发送POST请求时,就将那时候的请求体数据中设置csrf_token这样就能csrf防护了

3.设置cookie中的csrf_token

  • step1 为web_html.py中导入csrf包
from flask_wtf import csrf
  • step2 创建一个csrf_token的值 
csrf_token = csrf.generate_csrf()
  • step3 导入make_response,将返回的静态文件方法的值构建成响应对象
resp = make_response(current_app.send_static_file(html_file_name))
  • step4 设置cookie的值,有效期为临时会话
resp.set_cookie("csrf_token", csrf_token)
  •  step5 重新启动程序,刷新网页,查看我们设置的cookie

三丶用户注册模块(图片验证码以及短信验证码)

 1.图片验证码使用流程

  • step1 分析流程:

第一步,需要前端像后端发起一个获取图片验证码的请求,对于后端来说就需要去生成一个随机的验证码图片;第二步将生成的验证码图片返回给前端;第三步验证图片验证码的准确性,如果正确,才能发起获取短信验证码的请求

  • step2 具体细节

在发起获取短信验证码请求的时候将携带填写的图片验证码与后端生成的图片验证码进行校验,因此后端在生成图片验证码的时候,需要将图片进行保存,意义是为了与用户输入的图片验证码进行对比,对比成功,才会给用户返回短信验证码

  • step3 问题分析

后端生成的图片验证码是存在哪里,谁来维护有效期,不可能一张图片一直用下去,所以将在后端生成的图片验证码,存到redis数据库中,在后端进行验证的时候,就从redis中取出这个值,与前端用户输入的值进行对比即可;但是对于多个用户来说同一时间向我发送获取图片验证码时,该怎么去判断谁是谁的,所以要将图片验证码进行编号处理,来分辨是属于哪个用户的图片验证码,那么就需要在用户发起短信验证码请求的携带参数里面除了填写的图片验证码,还需要携带一个用户编号,因此对于后端服务器来说,除了生成图片验证码的值,还需要生成一个对应验证码的编码,一起保存到redis数据库中,还需要将验证码值和编码返回给前端用户,那么就需要从返回的响应体中取解析编码,这样做太麻烦了,为了减轻后端的压力,将不再由后端去生成这个编码了,而是由前端在一开始就去生成这个编号,再前端向后端服务器发起获取图片验证码请求的时候携带一个编码参数,然后后端将编码和图片验证码的值一起存到redis数据库中

  • step4 在ihome/api_1_0目录下创建一个verify_code.py文件,将图片验证码以及短信验证码放在这个文件里面进行使用
  • step5 使用restful风格构建前端向后端发起图片验证码请求地址
GET http://127.0.0.1:5000/api/v1.0/image_codes/<image_code_id>

2.图片验证码后端接口编写

  • step1 将图片验证码工具包captcha拷贝到ihome/utils目录下
  • step2 在verify.py中导入captcha包中的captcha模块中的captcha对象
from ihome.utils.captcha.captcha import captcha
  • step3 通过调用captcha对象中的generate_captcha方法来获取生成的验证码名字,文本内容,以及图片二进制数据
name, text, image_data = captcha.generate_captcha()
  • step4 选择存储数据类型,将验证码的文本内容以及编码存到redis数据库中,并设置有效期

可以使用哈希格式进行存储,但是无法设置单个图片的有效期

示例:

"image_codes": {"id1":"abc", "":""} 哈希  hset("image_codes", "id1", "abc")  hget("image_codes", "id1")

使用字符串格式对数据进行存储,以编码作为key,以文本内容作为value值进行存储即可

示例:

"image_code_编号1": "真实值"
"image_code_编号2": "真实值"
redis_store.set("image_code_%s" % image_code_id, text)
redis_store.expire("image_code_%s" % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES)
  • step5 在verify.py中导入redis数据库连接对象,然后将编码和文本内容存到redis数据库
from ihome import redis_storeredis_store.set("image_code_%s" %image_code_id, text)
  • step6 设置图片验证码有效期为三分钟,首先在ihome目录下创建一个constants.py文件,用于存放常量
redis_store.expire("image_code_%s" %image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES)

 设置值和有效期一步到位

redis_store.setex("image_code_%s" %image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
  • step7 对于数据库连接,可能会出现连接错误以及连接不上等问题,所以需要捕获异常,并且将捕获到的异常保存到日志中
current_app.logger.error(e)
  • step8 当出现异常后,需要返回错误信息的json数据,先将工程项目定义好的response_code.py响应状态码文件,拷贝到utils中

return jsonify(errno=RET.DBERR, errmsg="save image code failed")
  • step9 没有出现异常,则先通过make_response构造图片image_data数据响应体对象,再设置该响应体对象的请求头中的Content-Type为图片格式jpg,返回给前端

 

 3.开发流程与编写接口文档

  • step1 开发流程

1. 分析需求
           2. 编写代码
           3. 编写单元测试
           4. 自测
           5. 编写接口文档
           6. 提测代码

  • step2 编写接口文档
接口文档1. 接口名字
2. 描述(描述清楚接口的功能)
3. url
4. 请求方式
5. 传入参数
6. 返回值接口:获取图片验证码描述:前端访问,可以获取到验证码图片url: /api/v1.0/image_codes/<image_code_id>请求方式: GET传入参数:格式:路径参数 (参数是查询字符串、请求体的表单、json、xml)名字             类型       是否必须      说明image_code_id    字符串       是         验证码图片的编号返回值:格式: 正常:图片, 异常:json名字             类型       是否必传      说明errno          字符串         否        错误代码errmsg         字符串         否        错误内容实例:'{"errno": "4001", "errmsg": "保存图片验证码失败"}'

四丶测试后端verify_code接口是否正确

1.需要在api_1_0/init中导入我们写的接口文件verify_code让蓝图知道有一个verify_code的模块

from . import verify_code

2.运行程序

python manage.py runserver

3.在浏览器中输入http://127.0.0.1:5000/api/v1.0/image_codes/123,成功显示出验证码图片

4.查看程序运行日志

5.此时查看redis数据库中,会发现出现了一个image_code_123的键,获取该键的值就是图片验证码的文本值,说明我们写的后端接口没问题

 

转载于:https://www.cnblogs.com/cdtaogang/p/10631084.html

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

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

相关文章

手把手教你配置阿里云服务器搭建网站平台

购买服务器学生的话&#xff0c;阿里推出了一个叫云翼计划的产品&#xff0c;通过学生认证之后可以享受超便宜的价格&#xff0c;我的账号是支付宝账号&#xff0c;之前就有过学生认证。云翼计划的入口在这儿云翼计划配置服务器如果我是学生&#xff0c;我如何通过&#xffe5;…

【干货】让你薪资翻10倍的网站 大学生与职场人请收藏(转载)

作者&#xff1a;小强先森 链接&#xff1a;https://www.jianshu.com/p/21b92c8b008d零基础自学java,点击了解:https://how2j.cn作为一个过来人&#xff0c;真的想谈谈。不管你现在是学生&#xff0c;还是参加工作不久&#xff0c;希望这篇文章都可以帮到你。重在实践想要成为一…

大型网站架构演变

前言 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0c;在这个过程中&#xff0c;开发模式、技术架构、设计…

初学者创建个人网站如何选择服务器

现如今&#xff0c;域名注册和空间服务器购买门槛很低&#xff0c;国内网站需要备案&#xff0c;如果是在国外&#xff0c;都不用备案&#xff0c;买了就可以使用&#xff0c;很简单&#xff0c;很方便&#xff0c;所以个人站长越来越多&#xff0c;有些人是为了个人兴趣来做个…

零基础自学网站分享

俗话说工欲善其事&#xff0c;必先利其器,今天给大家分享一个java自学网站:how2j,这是一个有十年淘宝工作经验大牛的制作的网站,距离现在已经有三四年了,这个网站包含的知识非常的多,从基础的环境变量配置一直到完整项目的开发部署,以及面试教程,还有很多工具可提供直接下载使用…

如何将自己开发的网站部署到阿里云上?

呐呐呐&#xff0c;做人呢&#xff0c;最重是要开心啦。呐呐呐&#xff0c;做Java呢&#xff0c;最重要是要把自己的“作品” 部署到公网上去啦。特别是初学者&#xff0c;需要向面试官证明自己会什么&#xff0c;这个真的就很重要啦&#xff0c;空口无凭&#xff0c;为什么面试…

程序员学习网站:

转自&#xff1a;https://www.jianshu.com/p/5c647781697c 因为主流的计算机编程是以英语为基础的&#xff0c;所以很多优秀的、大牛集聚的码农社区都是英文的。但是笔者认为&#xff0c;既然是自学&#xff0c;兴趣是第一动力&#xff0c;所以不该让语言成为负担&#xff0c;因…

没有任何编程经验如何搭建一个个人博客网站?

文章首发地址&#xff1a;ps://www.dechenyun.com/154.html 文章作者&#xff1a;小白上云网 之前有录制和编写过WordPress搭建个人博客的内容&#xff0c;但是都比较麻烦&#xff0c;需要在控制台黑框复制运行相关的命令&#xff0c;很多没接触过过的用户还是有一定的困难&…

腾讯云服务器利用镜像部署WordPress个人网站!

操作场景 本文档介绍如何在腾讯云云服务器&#xff08;以下简称 CVM&#xff09;上安装 WordPress 镜像来启动并运行一个网站。您将了解如何配置并启动 CVM 实例&#xff0c;如何获取 WordPress 用户名和密码&#xff0c;以及如何登录 WordPress 管理页面。 技能要求 腾讯云…

完全零基础小白如何搭建一个属于自己的个人博客网站?

WordPress 作为动态博客的代表&#xff0c;至今已经有十几年历史&#xff0c;而且一直在更新发展中&#xff0c;功能强大&#xff0c;插件和主题丰富&#xff0c;WordPress搭建使用也很方便。作为个人站长和博主&#xff0c;很多都是从 WordPress 入门的。 本文为零基础 WordP…

大型网站如何实现图片服务器分离 提高网站性能

1 介绍 大家可以关注一下当前所有的大型网站&#xff0c;他们的图片URL一般都会用其他二级域名&#xff0c;其服务器也是独立的服务器。现在很多的网站上都会用到大量的图片&#xff0c;而图片是网页传输中占主要的数据量,也是影响网站性能的主要因素。 因此很多网站都会将图…

如何使用腾讯云提供的WordPress应用镜像搭建博客网站系统!

之前也有写过搭建WordPress的教程&#xff0c;如何使用轻量应用服务器搭建WordPress个人博客使用的是宝塔面板一件搭建的方式&#xff0c;但是还是有一些麻烦&#xff0c;这里我们之间使用腾讯云提供的WordPress应用镜像搭建&#xff0c;感兴趣小伙伴可以参考以下&#xff01; …

腾讯云轻量应用服务器使用WordPress应用镜像搭建网站应用

WordPress 是全球最流行的开源的博客和内容管理网站的建站平台&#xff0c;具备使用简单、功能强大、灵活可扩展的特点&#xff0c;提供丰富的主题插件。腾讯云轻量应用服务器提供 WordPress 应用镜像&#xff0c;您可以使用它快速搭建博客、企业官网、电商、论坛等各类网站。 …

如何使用宝塔 Linux 面板快速迁移网站数据至腾讯云轻量应用服务器?

宝塔 Linux 面板&#xff08;BT-Panel&#xff09;是一款简单好用的服务器运维面板&#xff0c;支持一键部署 LAMP、LNMP、集群、监控、网站、FTP、数据库、JAVA 等100多项服务器管理功能&#xff0c;能够极大提升运维管理效率。本文档介绍如何使用宝塔 Linux 面板快速迁移其他…

使用JMeter对网站并发性测试

目录结构&#xff1a; contents structure []1. 下载JMeter2. 启动JMeter1) 建立线程。2) 设置请求服务器、压力链接等信息3) 查看运行结果3&#xff0c;分析数据Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web…

CentOS6.9安装WordPress搭建自己的博客网站

首先说明我用的是服务器上之前装的mysql数据库&#xff0c;只需要配置上就行了 准备工作 CentOS6.9 在/目录下创建一个目录src&#xff0c;把下载的东西都放到这个文件夹下 下载Apache Httpd&#xff0c;下载地址&#xff1a; http://httpd.apache.org/download.cgi#apache24 w…

精简代码,为网站减负的十大建议

网站快速加载&#xff0c;是提供良好用户体验的前提。然而&#xff0c;网站功能的不断增多&#xff0c;程序包的不断臃肿&#xff0c;导致网站访问时较大的下载量&#xff0c;最终影响了响应速度。没有一个用户喜欢等待&#xff0c;如何减少代码量&#xff0c;为网站减去过多负…

精简代码,为网站减负的十大建议

网站快速加载&#xff0c;是提供良好用户体验的前提。然而&#xff0c;网站功能的不断增多&#xff0c;程序包的不断臃肿&#xff0c;导致网站访问时较大的下载量&#xff0c;最终影响了响应速度。没有一个用户喜欢等待&#xff0c;如何减少代码量&#xff0c;为网站减去过多负…

推荐20个让你学习并精通CSS的网站

1. A List Apart CSS Topics A List Apart&#xff0c;学习网页设计和最佳实践的首选网站。这个网站从1999年就开始发表关于CSS的文章&#xff0c;其中大部分文章都是面向那些更注重符合标准设计的中级到高级设计师。 2. CSS Help Pile CSS Help Pile汇集了大量的CSS资源、技巧…

HttpClient模拟登录12306购票网站

首先12306网站前缀为“https://”表明是用SSL加密。 用HttpClient去模拟发送请求时&#xff0c;对于URL用为“https”时&#xff0c;先要解决证书问题&#xff0c;有两种解决方案&#xff1a; a.使证书被信任。 在查找相关资料时&#xff0c;对于这种方法有点麻烦&#xff0c;最…