Django加密应用程序第1部分:功能要求和设置
#javascript #网络开发人员 #django #crypto

目录

Buy Me A Coffee

介绍

欢迎参加这个由三部分组成的技术教程系列,我们将在其中构建一个Django项目,使用户能够管理其加密货币组合。为了实现功能和其他功能,我们将利用Coingecko或任何其他加密货币API的API调用。

在第1部分中,我们将定义功能要求,并概述使用Django的方法,高级设计和项目设置。我们还将配置settings.py文件,创建模型并在管理面板中注册。

在第2部分中,我们将添加模板,视图和URL,并在整个项目中进行编码。这将是本系列中最复杂,最详细的部分。

在第3部分中,我们将通过使用PYTEST编写模型,视图和模板来讨论测试案例来包装系列。

可以在此处找到整个项目的代码 - > Github Repo for Django Crypto App

定义功能要求

功能要求定义软件系统或应用程序应采取的措施来满足用户的需求和业务目标。他们描述了系统的功能,功能和功能,以及它在不同情况下的表现。让我们绘制该项目的期望结果,以更好地帮助我们开发过程。我们将把应用程序分为几个部分,以实现总体目标:

  1. 用户身份验证

系统应提供注册,登录和登录功能,包括密码恢复功能。我们将确保使用Django的内置身份验证系统牢固地存储密码和哈希。

  1. 推荐系统

用户应该能够邀请其他人使用推荐链接加入平台。当新用户使用其链接注册时,我们将跟踪转介链接并给推荐人获得奖励。

  1. 钱包管理

用户应该能够在钱包中添加和删除加密货币。对于每种加密货币,用户可以将其名称,符号,当前价格和数量添加到其投资组合中。

  1. 投资组合视图

用户应该能够详细查看其投资组合,以显示其钱包中每个加密货币的价值以及其投资组合的总价值。

  1. 主页

首页应显示前10名排名加密货币的24小时价格和百分比变化,以及用户投资组合中货币的24小时价格和百分比变化。我们将使用表表示数据(表类型取决于您)。

  1. 搜索栏

我们将包括一个搜索栏,允许用户搜索新的加密货币以添加到其投资组合中。

技术堆栈

  • Language: Python 3.10
  • 框架:Django 4.0+
  • 数据库:sqlite [默认]
  • API使用:CoinGecko-公共版本,没有API密钥。费率限制为10-25 req/minune
  • 前端:Bootstrap 5.1.3
  • 测试:Django测试框架
  • 测试覆盖范围:90%+
  • 开发方法:TDD(测试驱动开发)

计划的终点

由于我们计划了功能要求,因此我们现在可以确定将添加到项目中的URL。这些URL中的大多数都将伴随模板和后端视图。

localhost:8000/         -> [home view]
localhost:8000/login
localhost:8000/logout
localhost:8000/signup
localhost:8000/signup/str:referral_code
localhost:8000/portfolio
localhost:8000/search
localhost:8000/add_to_portfolio
localhost:8000/delete_from_portfolio/int:pk
localhost:8000/password_reset
localhost:8000/password_reset_done
localhost:8000/password_reset_confirm/<uidb64>/<token>
localhost:8000/password_reset_complete 
localhost:8000/admin

创建一个新的Django项目

要为加密货币投资组合管理系统创建一个Django项目,请按照以下步骤:

  1. 导航到要创建项目的文件夹。使用命令cd,然后使用目录名称移至该文件夹。
cd django-crypto-app
  1. 为您的项目创建虚拟环境。这是可选的,但建议使用,因为它有助于使依赖关系与系统上的其他项目分开。使用命令python -m venv,然后使用您要给环境的名称。
python -m venv env 
  1. 通过运行位于env/Scripts文件夹中的激活脚本来激活虚拟环境。
env\Scripts\activate
  1. 安装项目所需的软件包。这包括用于构建Web应用程序的Django,进行API调用的请求以及用于测试目的的覆盖范围。使用pip install命令,然后使用软件包名称。我强烈建议使用sumpplion.txt文件来跟踪您的依赖关系。另外,请转到GitHub repo,然后检查需求.txt文件以获取最新依赖项。下面列出的是在撰写本文时使用的内容,但请检查要求。
pip install django
pip install requests
pip install coverage
pip install django-crispy-forms
pip install crispy-bootstrap5
  1. 使用django-admin命令在当前文件夹中启动一个新的Django项目。在命令的末尾添加一个点,以指定要使用当前文件夹作为项目目录。
django-admin startproject crypto .
  1. 使用startapp命令创建一个名为mainapp的django应用程序。
python manage.py startapp mainapp
  1. 通过运行makemigrations创建数据库表,然后是migrate
python manage.py makemigrations
python manage.py migrate
  1. 创建一个超级用户帐户以访问Django管理面板。将提示您输入用户名,电子邮件和密码。
python manage.py createsuperuser
  1. 使用runserver命令启动服务器。
python manage.py runserver
  1. 打开浏览器,然后转到http://localhost:8000/查看Django欢迎页面。

Running Server

  1. 要访问管理面板,请访问http://localhost:8000/admin并使用您在步骤8中创建的超级用户帐户登录。
  2. 最后,生成一个要求。txt文件,该文件列出了项目中使用的所有软件包及其版本。
pip freeze > requirements.txt

这些步骤将创建一个基本的Django项目,可以用作构建加密货币投资组合管理系统的起点。

配置settings.py

这是项目文件结构的样子: -
Project File Structure

crypto-主要项目文件夹。包含settings.py文件和urls.py文件。

crypto\static-包含该项目的静态文件,例如CSS,JS,图像等。

templates-包含该项目的HTML模板。我更喜欢在根文件夹中设置模板,并在settings.py文件中配置TEMPLATES设置以指向模板文件夹。

mainapp-主要的应用程序夹。

mainapp\urls.py-包含主应用的URL。

mainapp\views.py-包含主应用的视图。

mainapp\tests.py-包含主应用的测试。

mainapp\models.py-包含主要应用程序的模型,例如CryptoPortfolio

mainapp\forms.py-包含主应用的表单,例如CustomUserCreationForm

mainapp\migrations-包含主应用的迁移。

mainapp\signals.py-创建用户后包含create_profile信号。


在本节中,我们将为我们的Django项目做出一些配置。这是要遵循的步骤:

  1. 在主要项目目录中打开settings.py文件。

  2. 更改ALLOWED_HOSTS = ["*"]以允许任何主机连接到我们的应用程序。

  3. 添加我们新创建的自定义应用MainApp以及我们将在以后使用的第三方软件包,通过将以下代码行添加到installed_apps部分:

"mainapp",
"crispy_forms",
"crispy_bootstrap5",
  1. 我们将使用crispy_forms和crispy_bootstrap5来造型我们的表格。因此,我们需要通过添加以下代码行,将CRISPY_LALLED_TEMPLATE_PACKS和CRISPY_TEMPLATE_PACK变量设置为“ Bootstrap5”:
    CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
    CRISPY_TEMPLATE_PACK = "bootstrap5"
  1. 在主项目目录中创建一个名为模板的新文件夹以存储所有前端模板。

  2. 将以下代码添加到模板部分,以指定我们创建的模板目录:

"DIRS": ["templates"], # change this line!
  1. 接下来,我们需要设置静态和媒体文件路由。将以下代码行添加到settings.py文件:
STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "static"
STATICFILES_DIRS = ["crypto/static"]
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
  1. 我们还需要电子邮件配置来向我们的用户发送重置密码电子邮件。将以下代码行添加到settings.py文件:
from decouple import config

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = config('EMAIL_HOST_USER') # load from .env file
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD') # load from .env file
DEFAULT_FROM_EMAIL = "Crypto App <your-email-here@gmail.com>" # change this to your own email
  1. 最后,在您的主要项目目录中创建一个.env文件,然后添加以下变量:
EMAIL_HOST_USER=<your-email-here>
EMAIL_HOST_PASSWORD=<your-password-here>

确保分别替换并分别替换您自己的电子邮件和密码。

通过单击本教程顶部的链接。

配置urls.py

由于我们将使用MainApp作为主应用程序,因此我们需要在主项目目录中配置urls.py文件以指向MainApp。转到核心项目文件夹和URL文件 - > crypto/urls.py,然后添加以下代码行:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("mainapp.urls")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

创建应用模型

在此代码段中,我们为Django Web应用程序创建了四个不同的模型。这些模型用于为我们的Web应用程序定义数据库结构。这四个型号是:

  1. 用户模型:这是Django身份验证系统提供的默认用户模型。我们正在覆盖此模型以使电子邮件字段与众不同。
  2. 配置文件模型:此模型用于存储有关用户的其他信息。它与用户模型有一对一的关系。我们正在使用Django的信号自动为每个用户创建一个配置文件。
  3. 推荐模型:此模型用于跟踪用户进行的转介。它与用户模型有外国密钥关系,以及与推荐人的另一种外键关系。
  4. 加密货币模型:该模型用于存储有关加密货币的信息。它与用户模型有外国密钥关系,使我们能够将加密货币链接到特定用户。它存储每个加密货币的名称,符号,当前价格和数量。
  5. 投资组合模型:此模型用于存储有关用户投资组合的信息。它与用户模型有外国密钥关系,使我们能够将投资组合链接到特定用户。它存储投资组合的总价值。

Models

使用Django提供的models.Model类定义了每个模型。每个模型的字段使用各种字段类型(例如Charfield和Decimalfield)定义。我们还使用各种模型关系,例如外国基础和Onetoonefield,将我们的模型联系在一起。

总的来说,这些模型为我们的Web应用程序提供了必要的数据库结构,使我们能够存储和操纵与用户,个人资料,推荐,加密货币和投资组合有关的数据。

from django.contrib.auth.models import User
from django.db import models

# Override the default User model to make the email unique
User._meta.get_field('email')._unique = True

# Make the profile for a user, automatically created when a user is created using Django signals
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    referral_code = models.CharField(max_length=10, unique=True)
    bonus = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.user.username} profile'

# Create the referal model
class Referal(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    referrer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='referrals')

    def __str__(self):
        return f'{self.user.username} was referred by {self.referrer.username}'

# Create the Cryptocurrency model
class Cryptocurrency(models.Model):
    # here name is also the id of the cryptocurrency, so useful for API calls
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='cryptocurrencies', null=True)
    id_from_api = models.CharField(max_length=50)
    name = models.CharField(max_length=50) 
    symbol = models.CharField(max_length=10)
    current_price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.DecimalField(max_digits=10, decimal_places=2, default=1)

    class Meta:
        unique_together = ('user', 'name')

    def __str__(self):
        return f'{self.name} ({self.symbol})'

# Create the portfolio linked to a user and store the total value of the portfolio
class Portfolio(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='portfolios')
    total_value = models.DecimalField(max_digits=15, decimal_places=2)

    def __str__(self):
        return f'{self.user.username} - Portfolio: {self.total_value}'

在管理员中注册模型

要使我们的模型可从Django管理面板访问,我们需要在admin.py文件中注册它们。这是需要添加的代码:

from django.contrib import admin
from .models import Cryptocurrency, Portfolio, Profile, Referal

@admin.register(Referal)
class ReferalAdmin(admin.ModelAdmin):
    list_display = ('user', 'referrer')

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'referral_code', 'bonus')

@admin.register(Cryptocurrency)
class CryptocurrencyAdmin(admin.ModelAdmin):
    list_display = ('user', 'name', 'id_from_api', 'symbol', 'current_price', 'quantity')

@admin.register(Portfolio)
class PortfolioAdmin(admin.ModelAdmin):
    list_display = ('user', 'total_value')

在此代码中,我们首先导入要注册的模型。然后,对于每个模型,我们创建一个从admin.ModelAdmin继承的新类,该类使我们能够自定义模型在管理面板中显示的方式。我们将list_display设置为指定要为模型的每个实例显示的字段。

将此代码添加到admin.py后,我们需要运行迁移以更新数据库架构。为此,我们可以运行以下命令:

python manage.py makemigrations
python manage.py migrate

第一个命令根据我们对模型的更改创建一个新的迁移文件,而第二个命令将这些更改应用于数据库。运行这些命令后,模型将在管理面板中注册,我们可以通过仪表板接口与它们进行交互。

结论

在这篇技术博客文章中,我们介绍了使用Django构建Web应用程序的初始步骤。我们首先指定项目的要求并计划项目结构。然后,我们确定了应用程序所需的URL和模型,并配置了settings.py文件以确保我们的应用程序正常工作。

接下来,我们创建了模型并彼此定义了他们的关系,这帮助我们布置了数据库模式。我们还在Django管理面板中注册了模型,使我们可以通过仪表板接口轻松与它们进行交互。

总的来说,我们已经成功完成了项目的介绍部分。在下一部分中,我们将研究视图,表单,模板和URL,以构建应用程序的核心功能。这将帮助我们创建一个满足我们项目要求的动态且响应迅速的Web应用程序。请继续关注下一部分!