網站搭建基本流程

需求分析:

實現網站搭建的過程:首先進行網站的需求性分析

網站可分為前臺系統和后臺系統,由不同的功能拆分為不同的模塊

如下是一個電商網站可以拆分出的模塊:

在編寫代碼前,我們要先對網站進行架構,通過分層設計網站的不同組件,軟件開發人員可以選擇修改和添加應用層,而非全局作出更改

如下是經典的三層結構:

接入層:提供靜態內容的web前端服務器和部分動態緩存內容。

邏輯層:生成動態內容的應用服務器。

存儲層:提供數據存儲的服務器

TIPS:

為什么之前在用Django的時候直接runserver就好了呢?因為Django的開發服務器(runserver)是一個輕量級服務器,能夠處理HTTP請求和提供靜態資源服務,但主要應用于調試階段,由于單線程且沒有負載均衡SSL加密等功能,在生產環境中我們需要專業的接入層,像是Nginx

模塊引入:

為了確保功能的實現,我們可以引入所需的功能模塊

其中,installed_app這個設置告訴用戶在該項目中安裝了哪些程序,可以是第三方或自定義的,也可以是django自帶的

middleware這個設置定義了處理請求的中間件和響應件,中間件是處理請求和響應的鉤子,可用于請求到達視圖/響應返回客戶段前執行特定的操作。

在構建網站的過程中,我們要把不同需求拆解為功能模塊的同時為其添加數據庫表結構

首先,我們來進行用戶模塊的構建:

INSTALLED_APPS = [# 其他已安裝的應用...'django.contrib.auth', ?# 用戶驗證框架和模型'django.contrib.contenttypes', ?# 權限管理]MIDDLEWARE = [# 其他中間件...'django.contrib.sessions.middleware.SessionMiddleware', ?# 會話管理系統'django.contrib.auth.middleware.AuthenticationMiddleware', ?# 用戶驗證模型]

這是利用了Django自帶的用戶模塊,配置當中的.就是/的意思,暗含代碼路徑在django/contrib/auth/moddles.py,模型里面包含這些內容

讓我們先來了解一下用戶模塊:

django.contrib.auth 模塊為我們提供了用戶認證系統的核心功能,包括用戶模型、表單、視圖、URL 配置等,這些功能已經預先定義好,可以直接使用或根據需要進行擴展。它是一個完整的用戶認證框架,旨在幫助開發者快速實現用戶注冊、登錄、權限管理等功能,而無需從頭開始編寫這些代碼。

Django 自帶用戶認證模塊提供的功能

以下是 Django 自帶用戶認證模塊(django.contrib.auth)為你預先定義好的內容:

----

1. 用戶模型(User)

Django 提供了一個默認的用戶模型 User,定義在 django.contrib.auth.models 中。它包含以下字段:

? ?username:用戶名

? ?password:密碼(加密存儲)

? ?email:郵箱

? ?first_name 和 last_name:用戶姓名

? ?is_active:是否激活

? ?is_staff:是否是管理員

? ?is_superuser:是否是超級用戶

? ?groups 和 user_permissions:用戶組和權限

你可以直接使用這個默認的用戶模型,或者通過繼承 AbstractUser 或 AbstractBaseUser 來擴展它。

----

2. 表單(forms)

Django 提供了一些內置的表單類,用于用戶注冊、登錄、密碼修改等功能:

? ?UserCreationForm:用戶注冊表單

? ?AuthenticationForm:用戶登錄表單

? ?PasswordChangeForm:密碼修改表單

? ?SetPasswordForm:設置密碼表單

? ?PasswordResetForm:密碼重置表單

這些表單類已經預定義了字段和驗證邏輯,你可以直接使用,也可以通過繼承它們來自定義字段或驗證規則。

----

3. 視圖(views)

Django 提供了一些內置的視圖函數,用于處理用戶認證相關的操作:

? ?login:用戶登錄

? ?logout:用戶登出

? ?password_change:密碼修改

? ?password_reset:密碼重置

? ?password_reset_done:密碼重置完成

? ?password_reset_confirm:密碼重置確認

? ?password_reset_complete:密碼重置完成提示

這些視圖函數可以直接在 URL 配置中使用,或者通過繼承 View 類來自定義視圖邏輯。

----

4. URL 配置(urls)

Django 提供了一個 auth 應用的 URL 配置模塊 django.contrib.auth.urls,它包含了用戶認證相關的 URL 路由,例如:

from django.contrib.auth import views as auth_viewsurlpatterns = [path('login/', auth_views.LoginView.as_view(), name='login'),path('logout/', auth_views.LogoutView.as_view(), name='logout'),path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'),path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),]

?

你可以直接在項目的 urls.py 文件中包含這些 URL 路由,或者根據需要自定義 URL 路徑和視圖參數。

----

5. 中間件和會話管理

Django 的認證系統還提供了中間件(如 AuthenticationMiddleware)和會話管理功能,用于在請求中自動處理用戶認證信息,并將用戶對象綁定到 request.user。

----

擴展:

在很多時候我們都需要對Django自帶的模型進行相應的拓展

關聯表:

這個時候可以使用關聯表

用如下的onetoonefield方法創建:

from django.db import modelsfrom django.contrib.auth.models import Userclass Profile(models.Model):GENDER_CHOICES = (('M', 'Male'), ?# 男性('F', 'Female'), ?# 女性)user = models.OneToOneField(User, on_delete=models.CASCADE)gender = models.CharField(max_length=1, choices=GENDER_CHOICES) ?# 性別birth_date = models.DateField(null=True, blank=True) ?# 出生日期

?

模型字段解釋

1. ?GENDER_CHOICES:

? ?這是一個元組列表,用于定義性別字段的選項。每個元組包含兩個元素:第一個是存儲在數據庫中的值,第二個是顯示給用戶的值。

2. ?user:

? ?這是一個 OneToOneField 字段,它建立了 Profile 模型和 User 模型之間的一對一關系。

? ?User 是 Django 內置的用戶模型,通常包含用戶名、密碼、電子郵件等基本信息。

? ?on_delete=models.CASCADE 參數指定了當關聯的 User 實例被刪除時,相關的 Profile 實例也會被級聯刪除。

3. ?gender:

? ?這是一個 CharField 字段,用于存儲用戶的性別。

? ?max_length=1 指定了性別字段的最大長度為1個字符。

? ?choices=GENDER_CHOICES 參數將性別字段的值限制為在 GENDER_CHOICES 中定義的選項。

4. ?birth_date:

? ?這是一個 DateField 字段,用于存儲用戶的出生日期。

? ?null=True 允許該字段在數據庫中存儲為 NULL,這意味著它可以為空。

? ?blank=True 允許在 Django 管理后臺或表單中不填寫該字段。

關聯表的使用

在 Django 中,當你使用 OneToOneField 時,Django 會在數據庫中創建一個新的表來存儲 Profile 模型的數據。這個表會包含一個額外的字段(通常是 user_id),這個字段是一個外鍵,指向 User 表的主鍵。

例如,如果你的 User 表的主鍵是 id,那么 Profile 表可能會包含以下字段:

? ?id:Profile 表的主鍵。

? ?user_id:外鍵,指向 User 表的 id 字段。

? ?gender:存儲性別的字段。

? ?birth_date:存儲出生日期的字段。

這種設計允許每個 User 實例都有一個對應的 Profile 實例,而每個 Profile 實例只能屬于一個 User 實例。這種一對一的關系在數據庫中通過外鍵約束來實現,確保了數據的一致性和完整性。

總結

這段代碼通過 OneToOneField 創建了一個 Profile 模型,它與 User 模型建立了一對一的關系。這種關系通過在 Profile 表中添加一個外鍵字段來實現,該字段指向 User 表的主鍵。這種設計使得每個用戶都有一個相關的個人資料,而每個個人資料只屬于一個用戶。

信號定義:

在創建用戶過程中多次會用到創建用戶的代碼,為了避免重復創建,我們將定義一個信號,在創建用戶時自動創建檔案:

from django.apps import AppConfigclass MyAppConfig(AppConfig):name = 'myapp'def ready(self):import myapp.signals

?

?該方法使用要在myapp下創建一個signals.py文件并且在app.py文件當中重寫ready方法來連接信號,以及更新installed_apps

INSTALLED_APPS = [...'myapp.apps.MyAppConfig',...]

TIPS:當然,signals的內容也可以直接寫在models里面

然后我們在更改完models之后再去更改視圖和模版文件

模板:

<h2>{{ user.get_full_name }}</h2><ul><li>Username: {{ user.username }}</li> ?<!-- 顯示用戶名 --><li>Location: {{ user.profile.gender }}</li> ?<!-- 顯示性別 --><li>Birth Date: {{ user.profile.birth_date }}</li> ?<!-- 顯示出生日期 --></ul>

視圖:

def update_profile(request, user_id):user = User.objects.get(pk=user_id) ?# 獲取用戶對象user.profile.gender = 'M' ?# 設置性別user.save() ?# 保存

視圖函數當中反應的是對于用戶檔案的更新:在更新用戶檔案時,瀏覽器會先上傳一個表單,然后由服務器來處理這個表單,處理的方法就是視圖函數當中的先獲取數據對象,調用先前定義的模型進行修改,然后再調用save方法進行更新

注意!!:這里儲存的是模型的字段,因此不能直接儲存到數據庫,我們需要使用forms.ModelForm類創建表單

from django import formsclass UserForm(forms.ModelForm):class Meta:model = User ?# 關聯User模型fields = ('first_name', 'last_name', 'email') ?# 表單字段class ProfileForm(forms.ModelForm):class Meta:model = Profile ?# 關聯Profile模型fields = ('url', 'gender', 'birth_date') ?# 表單字段

然后再編寫對應用戶登陸的視圖

from django.contrib import messagesfrom django.shortcuts import redirect, renderfrom django.db import transactionfrom .forms import UserForm, ProfileForm@login_required ?# 驗證登錄@transaction.atomicdef update_profile(request):if request.method == 'POST': ?# POST請求user_form = UserForm(request.POST, instance=request.user) ?# 獲取用戶表單信息profile_form = ProfileForm(request.POST, instance=request.user.profile) ?# 獲取表單信息if user_form.is_valid() and profile_form.is_valid(): ?# 驗證通過則保存信息user_form.save()profile_form.save()messages.success(request, _('Your profile was successfully updated!'))return redirect('settings:profile')else: ?# 驗證不通過則顯示錯誤信息messages.error(request, _('Please correct the error below.'))else: ?# 其他請求,一般是GET請求user_form = UserForm(instance=request.user)profile_form = ProfileForm(instance=request.user.profile)# 返回表單頁面return render(request, 'profiles/profile.html', {'user_form': user_form,'profile_form': profile_form})

如上代碼當中,用戶如果用的是post方法,則獲取表單信息與之對照,如果是get方式則返回表單頁面,并將內容填入表單,(對應的,我們需要更改其模版文件)

<form method="post">{% csrf_token %}{{ user_form.as_p }} ?<!-- 渲染用戶表單 -->{{ profile_form.as_p }} ?<!-- 渲染Profile表單 --><button type="submit">Save changes</button> ?<!-- 提交按鈕 --></form>

繼承:

如果我們的用戶系統完全不需要某一字段,也可以使用繼承的方式(AbstractBaseUser)

from __future__ import unicode_literalsfrom django.db import modelsfrom django.core.mail import send_mailfrom django.contrib.auth.models import PermissionsMixinfrom django.contrib.auth.base_user import AbstractBaseUserfrom django.utils.translation import ugettext_lazy as _from .managers import UserManagerclass User(AbstractBaseUser, PermissionsMixin):GENDER_CHOICES = (('M', 'Male'), ?# 男性('F', 'Female'), ?# 女性)gender = models.CharField(max_length=1, choices=GENDER_CHOICES) ?# 性別birth_date = models.DateField(null=True, blank=True) ?# 出生年月email = models.EmailField(_('email address'), unique=True) ?# 電子郵件first_name = models.CharField(_('first name'), max_length=30, blank=True)last_name = models.CharField(_('last name'), max_length=30, blank=True)date_joined = models.DateTimeField(_('date joined'), auto_now_add=True) ?# 注冊時間is_active = models.BooleanField(_('active'), default=True) ?# 是否活躍avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) ?# 用戶頭像objects = UserManager()USERNAME_FIELD = 'email'REQUIRED_FIELDS = []class Meta:verbose_name = _('user')verbose_name_plural = _('users')def get_full_name(self): ?# 獲取用戶全名full_name = '%s %s' % (self.first_name, self.last_name)return full_name.strip()def get_short_name(self):return self.first_namedef email_user(self, subject, message, from_email=None, **kwargs): ?# 向用戶發送電子郵件send_mail(subject, message, from_email, [self.email], **kwargs)

在使用繼承AbstractBaseUser時,有很多相關的限制(建議直接重新自己寫)

?

如果要添加某一些字段,可以采用繼承AbstractUser方法,運營此法可對于原有的類進行更改

from django.db import modelsfrom django.contrib.auth.models import AbstractUserclass User(AbstractUser):GENDER_CHOICES = (('M', 'Male'), ?# 男性('F', 'Female'), ?# 女性)gender = models.CharField(max_length=1, choices=GENDER_CHOICES) ?# 性別birth_date = models.DateField(null=True, blank=True) ?# 出生年月

?

?

模塊設計的大概步驟:

然后我們再來進行商品庫模塊的設計:

首先我們設計了類別模型、商品模型以及類別和商品的多對多的模型

from django.db import modelsclass Category(models.Model):name = models.CharField('Name', max_length=255, db_index=True) ?# 類別名稱description = models.TextField('Description', blank=True) ?# 類別描述products = models.ManyToManyField('Product') ?# 多對多關系class Product(models.Model):title = models.CharField('Title') ?# 商品名稱description = models.TextField('Description', blank=True) ?# 商品描述attributes = models.TextField('Attribute', blank=True) ?# 商品附屬信息date_created = models.DateTimeField() ?# 商品創建時間

在上述代碼中,可以把manytomany理解為一個聲明,表示兩個表要建聯,而ProductCategory則可以視作聲明的具體內容

from django.http import HttpResponsefrom .models import Product, Categorydef get_product_detail(request, product_id): ?# 獲取商品詳情return Product.objects.get(pk=product_id)def get_all_products(request, category_id): ?# 通過類別獲取商品列表return Category.objects.get(pk=category_id).products.all()

定義相應的視圖函數(根據搜索返回商品的過程,實際搜索當中要比這復雜的多因為用戶的描述和實際商品的名稱并非完全相同,此時也要給出最合理的結果)

{% for product in productions %}<p>{{ product.title }}</p> ?<!-- 商品的名稱 --><p>{{ product.description }}</p> ?<!-- 商品的描述 -->{% endfor %}

并給出相應的模版文件(這里用了for標簽來渲染列表)

總結:

總之,網站的制作就是先進行需求分析,根據需求分析得到各個功能模塊,然后對每一個模塊進行編寫,編寫的順序為:模型文件再到視圖函數及其對應的模版文件,urls.py和settings.py的兩個視圖函數的編寫可以放在這一步之前也可以是之后,但是為了方便,編寫settings.py之前我們最好還是要明確自己要用到的所有models和middleware

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71612.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決elementUi el-select 響應式不生效的問題

情況一,字段類型不匹配 考慮option的value值的字段類型是否和api返回的字段類型一致&#xff0c;如果一個為字符串一個為數字類型是無法匹配上的 <template> <div><el-select v-model"value" size"large"style"width: 240px"&…

QT實戰-基于QWidget實現的異形tip窗口

本文主要介紹了qt中,基于QWidget實現異形tip窗口的幾種實現方式,話不多說,先上圖, 1.使用QPainter和QPainterPath實現 代碼:tipwnd1.h #ifndef TIPWND1_H #define TIPWND1_H#include <QWidget>class TipWnd1 : public QWidget {Q_OBJECTQ_PROPERTY(QColor my_border…

【C++篇】樹影搖曳,旋轉無聲:探尋AVL樹的平衡之道

文章目錄 從結構到操作&#xff1a;手撕AVL樹的實現一、AVL樹介紹1.1 什么是AVL樹1.2 平衡因子的定義1.3 平衡的意義1.4 AVL樹的操作 二、AVL樹的節點結構2.1 節點結構的定義&#xff1a; 三、插入操作3.1 插入操作概述3.2 步驟1&#xff1a;按二叉查找樹規則插入節點3.3 步驟2…

么是靜態住宅IP,跨境電商為什么需要靜態住宅IP

靜態住宅IP是指直接分配給一臺屬于私人住宅網絡的設備的固定IP地址&#xff0c;這種地址不會頻繁更改。它們作為代理IP&#xff0c;使使用者能夠通過這些代理服務器進行網絡訪問&#xff0c;而對外顯示的則是該住宅的IP地址。由于這些IP地址屬于真實的住宅或個人&#xff0c;并…

清華大學deepseek教程第四版 DeepSeek+DeepResearch 讓科研像聊天一樣簡單(附下載)

deepseek使用教程系列 DeepSeekDeepResearch 讓科研像聊天一樣簡單(附下載) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取碼: 1234 或 https://pan.quark.cn/s/f3d4511b790a

leetcode刷題記錄(一百零七)——279. 完全平方數

&#xff08;一&#xff09;問題描述 279. 完全平方數 - 力扣&#xff08;LeetCode&#xff09;279. 完全平方數 - 給你一個整數 n &#xff0c;返回 和為 n 的完全平方數的最少數量 。完全平方數 是一個整數&#xff0c;其值等于另一個整數的平方&#xff1b;換句話說&#x…

軟考高級信息系統項目管理師筆記-第2章信息技術發展

第2章 信息技術發展 2.1 信息技術及其發展 1、按表現形態的不同,信息技術可分為硬技術(物化技術)與軟技術(非物化技術)。前者指各種信息設備及其功 能,如傳感器、服務器、智能手機、通信衛星、筆記本電腦。后者指有關信息獲取與處理的各種知識、方法 與技能,如語言文字…

搭建RAG知識庫的完整源碼實現

搭建RAG知識庫的完整源碼實現&#xff08;基于Python 3.8&#xff09;&#xff1a; # -*- coding: utf-8 -*- # 文件名&#xff1a;rag_knowledge_base.py # RAG知識庫搭建完整源碼&#xff08;含中文注釋&#xff09;import os import re import shutil import chromadb from…

利用AFE+MCU構建電池管理系統(BMS)

前言 實際BMS項目中&#xff0c;可能會綜合考慮成本、可拓展、通信交互等&#xff0c;用AFE&#xff08;模擬前端&#xff09;MCU&#xff08;微控制器&#xff09;實現BMS&#xff08;電池管理系統&#xff09;。 希望看到這篇博客的朋友能指出錯誤或提供改進建議。 有紕漏…

基于SpringBoot的智慧家政服務平臺系統設計與實現的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

什么是 Cloud Studio DeepSeek ; 怎么實現Open WebUI快速體驗

什么是 Cloud Studio DeepSeek ;怎么實現Open WebUI快速體驗 一、概述 歡迎使用 Cloud Studio DeepSeek 工作空間!我們已為您預裝并啟動了以下服務,等待加載十幾秒即可查看效果: Ollama 服務:支持通過 API 調用 DeepSeek 模型。 AnythingLLM 前端服務:提供交互式聊天界…

【Python 語法】常用 Python 內置函數

reversed() 反轉reversed() 的語法反轉字符串、列表、元組 sorted() 自定義排序sorted() 語法使用示例1. 基本排序&#xff1a;默認升序排列2. 基本排序&#xff1a;降序排列3. 自定義排序&#xff1a;使用 key 參數4. 自定義排序&#xff1a;按某種規則進行排序5. 排序字典&am…

[網絡] 如何開機自動配置靜態IP,并自動啟動程序

背景&#xff1a; 需要固定ip地址&#xff0c;并且能夠自動啟動可執行文件。 流程&#xff1a; 1.在/etc/network/interfaces 中添加 auto eth0 iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0gateway 192.168.1.1 2.將下面這行代碼添加自動啟動腳本 …

打造智能聊天體驗:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果圖&#xff1a; 目錄 項目概述功能特點環境準備項目結構組件詳解 ChatContainerChatInputMessageBubbleTypeWriter 核心代碼示例使用指南常見問題 項目概述 基于 Vue 3 TypeScrip…

【C# 數據結構】隊列 FIFO

目錄 隊列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解釋&#xff1a; 小結&#xff1a; 環形隊列1. **FIFO&#xff1f;**2. **環形緩沖隊列如何實現FIFO&#xff1f;**關鍵概念&#xff1a; 3. **環形緩沖隊列的工作過程**假設…

Mac 清理緩存,提高內存空間

步驟 1.打開【訪達】 2.菜單欄第五個功能【前往】&#xff0c;點擊【個人】 3.【command shift J】顯示所有文件&#xff0c;打開【資源庫】 4.刪除【Containers】和【Caches】文件 Containers 文件夾&#xff1a;用于存儲每個應用程序的沙盒數據&#xff0c;確保應用程序…

Hutool - DFA:基于 DFA 模型的多關鍵字查找

一、簡介 在文本處理中&#xff0c;常常需要在一段文本里查找多個關鍵字是否存在&#xff0c;例如敏感詞過濾、關鍵詞匹配等場景。Hutool - DFA 模塊基于確定性有限自動機&#xff08;Deterministic Finite Automaton&#xff0c;DFA&#xff09;模型&#xff0c;為我們提供了…

C++STL容器之map

1.介紹 map是 C 標準模板庫&#xff08;STL&#xff09;中的一個關聯容器&#xff0c;用于存儲鍵值對&#xff08;key-value pairs&#xff09;。map中的元素是按照鍵&#xff08;key&#xff09;進行排序的&#xff0c;并且每個鍵在容器中是唯一的。map通常基于紅黑樹&#xf…

CentOS的ssh復制文件

1.前提 首先要已經連接上了對方的ssh 2.命令 scp [文件] 目標IP:目標路徑 例如&#xff1a; $PWD是一個環境變量&#xff0c;可以獲取當前絕對目錄&#xff0c;ssh上傳的時候一定要確保對方有這個目錄才行&#xff0c;不然會報錯 3.遞歸上傳 scp -r 目錄 目標IP:路徑 可以…

《Python實戰進階》專欄 No.3:Django 項目結構解析與入門DEMO

《Python實戰進階》專欄 第3集&#xff1a;Django 項目結構解析與入門DEMO 在本集中&#xff0c;我們將深入探討 Django 的項目結構&#xff0c;并實際配置并運行一個入門DEMO博客網站&#xff0c;幫助你在 Web 開發中更高效地使用 Django。Django 是一個功能強大的 Python Web…