”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Django、Twilio 和 Pinata 构建安全的匿名反馈系统

使用 Django、Twilio 和 Pinata 构建安全的匿名反馈系统

发布于2024-11-06
浏览:619

在本指南中,我将引导您使用 Django、用于短信通知的 Twilio、用于安全媒体上传的 Pinata 以及用于响应式样式的 TailwindCSS 构建安全匿名反馈系统。在本教程结束时,您将拥有一个功能齐全的反馈系统,用户可以在其中提交反馈、选择上传媒体以及接收短信通知 - 所有这些都考虑到安全和隐私。

演示:实时链接

主要特点:

  • 匿名反馈提交:用户可以匿名提交反馈或支持请求。
  • 安全媒体上传:用户可以通过 Pinata 安全地上传存储在 IPFS 上的媒体文件。
  • Twilio SMS 通知:通过 Twilio 自动向用户发送 SMS 确认。
  • 响应式 UI:采用 TailwindCSS 设计,实现无缝、现代的设计。

使用的技术:

  • Django:反馈系统的后端框架。
  • Twilio:处理短信通知。
  • Pinata:提供基于IPFS的安全媒体存储。
  • TailwindCSS:用于响应式前端样式。

第 1 步:项目设置和依赖项

1.1。创建并设置虚拟环境
首先设置您的项目环境。确保您已安装Python并设置虚拟环境:


python3 -m venv venv
source venv/bin/activate


在 Windows 上:


venv\Scripts\activate


安装必要的软件包:


pip install django twilio python-decouple requests gunicorn


1.2。启动 Django 项目
初始化一个新的 Django 项目和应用程序:


django-admin startproject config .
python manage.py startapp feedback


第2步:构建反馈提交系统

2.1。创建反馈模型
在feedback/models.py中定义一个模型来存储反馈提交:


from django.db import models

class Feedback(models.Model):
    message = models.TextField()
    sender_email = models.EmailField()
    sender_phone = models.CharField(max_length=15)
    media_url = models.URLField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Feedback from {self.sender_email}"


此模型捕获反馈、电子邮件、电话号码和可选媒体 URL。

2.2。创建用于处理反馈和短信通知的视图
在feedback/views.py中,创建视图来处理反馈并发送短信通知:


from django.shortcuts import render
from django.http import HttpResponse
from .models import Feedback
from twilio.rest import Client
from django.conf import settings
import requests

def upload_to_pinata(file):
    url = "https://api.pinata.cloud/pinning/pinFileToIPFS"
    headers = {
        'pinata_api_key': settings.PINATA_API_KEY,
        'pinata_secret_api_key': settings.PINATA_SECRET_API_KEY,
    }
    files = {'file': file}
    response = requests.post(url, files=files, headers=headers)
    return response.json().get('IpfsHash')

def submit_feedback(request):
    if request.method == 'POST':
        message = request.POST.get('message')
        sender_email = request.POST.get('sender_email')
        sender_phone = request.POST.get('sender_phone')
        file = request.FILES.get('media_file', None)

        media_url = None
        if file:
            media_url = upload_to_pinata(file)

        feedback = Feedback.objects.create(
            message=message,
            sender_email=sender_email,
            sender_phone=sender_phone,
            media_url=media_url
        )

        # Send SMS using Twilio
        client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
        client.messages.create(
            body=f"Feedback received from {sender_phone}: {message}",
            from_=settings.TWILIO_PHONE_NUMBER,
            to=sender_phone
        )

        return HttpResponse("Feedback submitted successfully!")

    return render(request, 'feedback_form.html')


此视图处理表单提交、将可选媒体上传到 Pinata 以及使用 Twilio 发送短信。

2.3。创建反馈表
创建 HTML 表单来提交反馈。在模板文件夹中,创建 Feedback_form.html:


{% load static %}



    Submit Feedback

Submit Feedback

{% csrf_token %}

Building a Secure Anonymous Feedback System with Django, Twilio, and Pinata
前端图片

Building a Secure Anonymous Feedback System with Django, Twilio, and Pinata
显示已上传文件的 Pinata 仪表板图像

步骤 3:配置 Twilio 和 Pinata

3.1。设置环境变量
在项目的根目录中创建一个 .env 文件来存储 Twilio 和 Pinata API 密钥等敏感信息:


SECRET_KEY=your-django-secret-key
DEBUG=True

TWILIO_ACCOUNT_SID=your_twilio_account_sid
TWILIO_AUTH_TOKEN=your_twilio_auth_token
TWILIO_PHONE_NUMBER=your_twilio_phone_number

PINATA_API_KEY=your_pinata_api_key
PINATA_SECRET_API_KEY=your_pinata_secret_api_key


确保将 .env 添加到您的 .gitignore 文件中,这样它就不会被推送到 GitHub:


.env


3.2。更新 settings.py 以使用环境变量
使用 python-de Couple 从 .env 文件安全地加载环境变量:


from decouple import config

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)

TWILIO_ACCOUNT_SID = config('TWILIO_ACCOUNT_SID')
TWILIO_AUTH_TOKEN = config('TWILIO_AUTH_TOKEN')
TWILIO_PHONE_NUMBER = config('TWILIO_PHONE_NUMBER')

PINATA_API_KEY = config('PINATA_API_KEY')
PINATA_SECRET_API_KEY = config('PINATA_SECRET_API_KEY')


第四步:推送到GitHub

4.1。初始化Git并推送到GitHub

  1. 在项目根目录中初始化 Git 存储库:

git init
git add .
git commit -m "Initial commit for feedback system"


  1. 将您的 GitHub 存储库添加为远程仓库并推送您的项目:

git remote add origin https://github.com/yourusername/feedback-system.git
git push -u origin main




结论

在本教程中,您使用 Django、用于短信通知的 Twilio 和用于媒体上传的 Pinata 构建了一个安全的匿名反馈系统。您还了解了如何将项目推送到 GitHub 并使用环境变量保护敏感信息。该系统确保隐私,同时使用户能够提交反馈和接收短信通知。

您可以通过添加更多功能或增强安全性来进一步扩展系统。如果您发现本指南有帮助,请在评论中分享您的反馈或问题!

项目的存储库可以在这里找到:存储库

版本声明 本文转载于:https://dev.to/chidoziemanagwu/building-a-secure-anonymous-feedback-system-with-django-twilio-and-pinata-4bh?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何防止游戏网站页面加载时重复插入?
    如何防止游戏网站页面加载时重复插入?
    调试页面加载时的重复插入在游戏网页上,观察到用户活动查询在页面刷新时将重复记录插入数据库。$insert_user_activity = mysql_query("INSERT INTO game_activity (user_id,user_full_name,game_id,game_...
    编程 发布于2024-11-06
  • Python 最佳实践:编写干净、高效且可维护的代码
    Python 最佳实践:编写干净、高效且可维护的代码
    Python 因其简单性、可读性和多功能性而成为最流行的编程语言之一。 无论您是经验丰富的开发人员还是初学者,遵循 Python 最佳实践对于编写干净、高效和可维护的代码至关重要。 在这篇博文中,我们将探讨编写 Python 代码时要牢记的一些关键最佳实践。 1 - 遵守 PEP...
    编程 发布于2024-11-06
  • std::lock_guard 与 std::scoped_lock:何时使用哪个锁?
    std::lock_guard 与 std::scoped_lock:何时使用哪个锁?
    std::lock_guard 与 std::scoped_lock:为任务选择正确的锁随着 C 17 的引入,std ::scoped_lock 类与现有的 std::lock_guard 一起出现,引发了关于它们之间的差异以及何时使用它们的问题。虽然 std::scoped_lock 与 std...
    编程 发布于2024-11-06
  • WebRTC简介
    WebRTC简介
    安装和代码指南 WebRTC(网络实时通信)是一种开源技术,可通过网络浏览器和移动应用程序中的简单 API 实现实时通信。它允许在点之间直接共享音频、视频和数据,无需中间服务器,非常适合视频会议、直播和文件共享等应用。 在本博客中,我们将深入探讨以下主题: 什么是WebRTC? W...
    编程 发布于2024-11-06
  • 如何在不使用 JavaScript 的情况下使用 CSS 隐藏和显示内容?
    如何在不使用 JavaScript 的情况下使用 CSS 隐藏和显示内容?
    使用 CSS 隐藏和显示内容:无需 JavaScript 的技巧在进行 Web 开发时,控制内容的可见性通常至关重要。传统上,这是使用 JavaScript 实现的,但 CSS 也可用于创建优雅的隐藏和显示效果。下面描述了一种此类技术,解决了先前方法遇到的特定挑战。隐藏/显示内容切换:可以使用 CS...
    编程 发布于2024-11-06
  • 如何创建重复最少的 5 个字符的随机字符串?
    如何创建重复最少的 5 个字符的随机字符串?
    生成 5 个具有最少重复的随机字符要创建具有最少重复的随机 5 个字符字符串,最有效的方法之一是使用PHP 函数和巧妙技术的结合。让我们深入研究解决方案:使用 md5 和 rand$rand = substr(md5(microtime()),rand(0,26),5);该方法使用md5哈希函数根据...
    编程 发布于2024-11-06
  • 如何在 Go 中处理不同包之间相同的方法签名?
    如何在 Go 中处理不同包之间相同的方法签名?
    处理不同包中具有相同方法签名的接口在Go中,当处理具有相同方法签名但定义在不同包中的多个接口时,可能会出现以下情况实现两个接口的类型会导致意外行为。考虑在不同包中定义的这两个接口(Doer)和函数(FuncA 和 FuncB):// Package A type Doer interface { D...
    编程 发布于2024-11-06
  • 如何使用 jQuery 填充级联下拉列表以获得更好的兼容性和用户体验?
    如何使用 jQuery 填充级联下拉列表以获得更好的兼容性和用户体验?
    使用 jQuery 填充级联下拉列表在表单开发领域,级联下拉列表经常用于提供更加用户友好和动态体验。为了增强兼容性并解决跨浏览器问题,jQuery 提供了一个强大的解决方案来异步填充这些下拉列表。问题中所示的用于创建级联下拉列表的原始 JavaScript 函数缺乏与 IE 的兼容性。为了解决这个问...
    编程 发布于2024-11-06
  • 了解 JavaScript 中的扩展运算符:初学者简单指南
    了解 JavaScript 中的扩展运算符:初学者简单指南
    介绍 JavaScript 是一种有趣的编程语言,其最令人兴奋的功能之一是扩展运算符。如果您刚刚开始编码,或者即使您是一个对学习 JavaScript 感兴趣的孩子,也不必担心!我将以最简单的方式分解这个概念,并举例来帮助您理解。 什么是价差运算符? 扩展运算符看起...
    编程 发布于2024-11-06
  • 在 Python 中使用 OpenSearch 掌握 CRUD 操作:实用指南
    在 Python 中使用 OpenSearch 掌握 CRUD 操作:实用指南
    OpenSearch, an open-source alternative to Elasticsearch, is a powerful search and analytics engine built to handle large datasets with ease. In this b...
    编程 发布于2024-11-06
  • 冰沙框架的重要概念||如何精通冰沙
    冰沙框架的重要概念||如何精通冰沙
    要精通 Frappe,有几个关键概念和领域需要关注。以下是最重要的细分: 1. 文档类型 定义:DocTypes是Frappe中的核心数据模型。每个实体或记录都存储在 DocType 中,并且它们可以具有字段、权限和工作流程。 为什么它很重要:了解如何创建和自定义 DocType 至...
    编程 发布于2024-11-06
  • 如何解决 JLabel 拖放的鼠标事件冲突?
    如何解决 JLabel 拖放的鼠标事件冲突?
    用于拖放的 JLabel 鼠标事件:解决鼠标事件冲突为了在 JLabel 上启用拖放功能,鼠标事件必须被覆盖。然而,当尝试使用 mousePressed 事件实现拖放时,会出现一个常见问题,因为 mouseReleased 事件对该 JLabel 无效。提供的代码在 mousePressed 事件中...
    编程 发布于2024-11-06
  • MySQL 中的数据库分片:综合指南
    MySQL 中的数据库分片:综合指南
    随着数据库变得越来越大、越来越复杂,有效地控制性能和扩展就出现了。数据库分片是用于克服这些障碍的一种方法。称为“分片”的数据库分区将大型数据库划分为更小、更易于管理的段(称为“分片”)。通过将每个分片分布在多个服务器上(每个服务器保存总数据的一小部分),可以提高可扩展性和吞吐量。 在本文中,我们将探...
    编程 发布于2024-11-06
  • 如何将 Python 日期时间对象转换为秒?
    如何将 Python 日期时间对象转换为秒?
    在 Python 中将日期时间对象转换为秒在 Python 中使用日期时间对象时,通常需要将它们转换为秒以适应各种情况分析目的。但是,toordinal() 方法可能无法提供所需的输出,因为它仅区分具有不同日期的日期。要准确地将日期时间对象转换为秒,特别是对于 1970 年 1 月 1 日的特定日期...
    编程 发布于2024-11-06
  • 如何使用 Laravel Eloquent 的 firstOrNew() 方法有效优化 CRUD 操作?
    如何使用 Laravel Eloquent 的 firstOrNew() 方法有效优化 CRUD 操作?
    使用 Laravel Eloquent 优化 CRUD 操作在 Laravel 中使用数据库时,插入或更新记录是很常见的。为了实现这一点,开发人员经常求助于条件语句,在决定执行插入或更新之前检查记录是否存在。firstOrNew() 方法幸运的是, Eloquent 通过firstOrNew() 方...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3