开发实践9_OnlinePlatform笔记

学习朔宁夫开发工程师课程笔记。

0架构:

01. MyDoc\PycharmProjects\ProjOnline,注册一个index app备主页用。

02. python manage.py startapp users, python manage.py startapp course. install apps.

03. total url

urlpatterns = [# http://127.0.0.1:8000/path("", include("index.urls", namespace="index")),path("admin/", admin.site.urls),path("user/", include("users.urls", namespace="user")),path("course/", include("course.urls", namespace="course")),
]

04. sub url 创建。

架构完成。

1 index_app编码:(main task:渲染主页。4个temp已经写好了,涉及2个文件夹’templates,static‘放到app目录下。删除temp下4个temp以外的文件。将temp文件夹复制到corse及user app下,然后3个app只保留相关temp即可。本次演示用默认的sqlite,不用mysql。setting LANGUAGE_CODE = "en-us" # "zh-hans" TIME_ZONE = "Asia/shanghai" # "UTC"

11.  views 类视图

from django.shortcuts import render
from django.views import Viewclass IndexView(View):def get(self, request):return render(self.request, 'index.html', locals())

12. urls

from django.urls import pathfrom index.views import IndexViewapp_name = 'index'urlpatterns = [path("", IndexView.as_view(), name="home")
]

13. 加载static index.html

<!doctype html>
{% load static %}
<html lang="zxx">

修改为正确{% static 'subpath' %}

可创建一个新的base_template,把公用模块写成block,用于后续course继承。

2 user_app编码(①记录用户登录状态;②登录/注册按钮显示为用户名):

21. views

from django.shortcuts import render
from django.views import Viewclass LoginRegisterView(View):def get(self, request):return render(request, 'my-account.html')

22. url

from django.urls import pathfrom users.views import LoginRegisterViewapp_name = 'users'urlpatterns = [path("login_register/", LoginRegisterView.as_view(), name='login_register')
]

23. html相应post表单中加入登录或注册链接

24. proj层new utils pack/ new py: utils.py

import hashlibdef gen_md5(string: str) -> str:md5 = hashlib.md5()md5.update(string.encode('utf-8'))return md5.hexdigest()

25. models 迁移

from django.db import modelsclass User(models.Model):user_name = models.CharField(max_length=64, verbose_name="User's name", unique=True)password = models.CharField(max_length=128, verbose_name="User's password")token = models.CharField(max_length=256, verbose_name="User's token", null=True)class Meta:db_table = 'users'verbose_name = 'users'verbose_name_plural = verbose_namedef __str__(self):return self.user_name@classmethoddef get_list(cls, **kwargs):filters = {}if kwargs.get('user_name'):filters['user_name'] = kwargs.get('user_name')if kwargs.get('password'):filters['password'] = kwargs.get('password')return cls.objects.filter(**filters)

26. 完善views

import timefrom django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import Viewfrom users.models import User
from utils.utils import gen_md5class LoginRegisterView(View):def get(self, request):return render(self.request, 'my_account.html', locals())class LoginView(View):def post(self, request):name = self.request.POST.get('name')password = gen_md5(request.POST.get('password'))users = User.objects.filter(user_name=name, password=password)  # querysetif users:user = users.filter()user.token = gen_md5(user.user_name) + str(time.time())user.save()self.request.session['user_name'] = user.user_nameself.request.session['user_token'] = user.tokenreturn redirect(reverse("index:home"))else:return HttpResponse("Invalid username or wrong password.")class RegisterView(View):def post(self, request):name = self.request.POST.get('name')password = gen_md5(request.POST.get('password'))users = User.objects.filter(user_name=name)if users:return HttpResponse("Occupied name.")User.create_one(user_name=name, password=password)return redirect(reverse("users:login_register"))

注意之后写的所有接口都需要从session中获取user name。

以下对主页写session验证(后端获取user name,前端作判断和选择展示):

27. index views

from django.shortcuts import render
from django.views import Viewclass IndexView(View):def get(self, request):user_name = self.request.session["user_name"]return render(self.request, 'index.html', locals())

28. index temps

                        <div class="register">{% if user_name %}{{ user_name }}{% else %}<a href="{% url 'users:login_register' %}" class="default-btn">Login / Register</a>{% endif %}</div>

3 course_app编码(①名称、分类、售价、日期;②可以admin后台管理;③验证登录,否则跳转;④查询页面有搜索及排序功能):

31.  models 一对多,在多方 课程 写入外键。便于维护:将课程的固定信息和变动信息写成一对一的两张表。迁移。

from django.db import modelsclass CourseCategory(models.Model):category_name = models.CharField(max_length=32, unique=True, verbose_name='Category name')class Meta:db_table = 'course_category'verbose_name = 'course categories'verbose_name_plural = verbose_namedef __str__(self):return self.category_name@classmethoddef get_one_by_name(cls, category_name):return cls.objects.filter(category_name=category_name).first()@classmethoddef get_all(cls):return cls.objects.all()class Course(models.Model):name = models.CharField(max_length=32, unique=True, verbose_name='Course name')price = models.FloatField(verbose_name='Course price')category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE)class Meta:db_table = 'course'verbose_name = 'Courses'verbose_name_plural = verbose_namedef __str__(self):return self.name@classmethoddef get_list(cls, **kwargs):#  courses = []  # 实例化。避免报错。filters = {}if kwargs.get('name'):filters['name__contains'] = kwargs.get('name')if kwargs.get('category'):filters['category'] = kwargs.get('category')return cls.objects.filter(**filters)class CourseInfo(models.Model):start_date = models.DateField(verbose_name='Start date')end_date = models.DateField(verbose_name='End date')course = models.OneToOneField(Course, on_delete=models.CASCADE)class Meta:db_table = 'course_info'verbose_name = 'course info'verbose_name_plural = verbose_namedef __str__(self):return self.course.name

32. 视图类

from django.core.paginator import Paginator, InvalidPage
from django.shortcuts import render
from django.views import Viewfrom course.models import *
from djangoProject.settings import PAGE_SIZEclass CourseListView(View):def get(self, request):category_name = request.GET.get('category', "")name = request.GET.get('name', "")page_num = self.request.GET.get("page", 1)courses = Course.get_list(category_name=category_name, name=name)# 注意这里查询是有bug。若同时传了两个参数,则name优先。应当q查询。categories = CourseCategory.get_all()filters = {}if category_name:filters['category'] = CourseCategory.get_one_by_name(category_name)if name:filters['name'] = namecourses = Course.get_list(**filters)paginator = Paginator(courses, PAGE_SIZE)try:courses = paginator.page()except InvalidPage:courses = paginator.page(1)return render(request, 'courses.html', locals())

33. 课程详情页

models中写入course的get_one方法:


class Course(models.Model):name = models.CharField(max_length=32, unique=True, verbose_name='Course name')price = models.FloatField(verbose_name='Course price')category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE)class Meta:db_table = 'course'verbose_name = 'Courses'verbose_name_plural = verbose_namedef __str__(self):return self.name@classmethoddef get_one(cls, category_id):try:return cls.objects.get(pk=category_id)except Exception:return None

写入courseinfo的查找方法:

class CourseInfo(models.Model):start_date = models.DateField(verbose_name='Start date')end_date = models.DateField(verbose_name='End date')course = models.OneToOneField(Course, on_delete=models.CASCADE)class Meta:db_table = 'course_info'verbose_name = 'course info'verbose_name_plural = verbose_namedef __str__(self):return self.course.name@classmethoddef get_list(cls, **kwargs):filters = {}if kwargs.get('course'):filters['course'] = kwargs.get('course')return cls.objects.filter(**filters)

视图类:

class CourseDetailView(View):def get(self, request, course_id):course = Course.get_one(course_id)course_info = CourseInfo.get_list(course=course)return render(self.request, "single-course.html", locals())

urls:

from django.urls import pathfrom course.views import CourseListView, CourseDetailViewapp_name = 'course'urlpatterns = [path('list/', CourseListView.as_view(), name='list'),path('detail/<course_id>/', CourseDetailView.as_view(), name='detail')
]

完善html

4 功能联调

41. course_app 下new middleware.py

from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixinclass CourseDetailsMiddleware(MiddlewareMixin):def process_request(self, request):if "/course/detail/" in request.path:user_name = request.session["user_name"]if not user_name:return redirect(reverse("user:login_register"))

注册 setting

MIDDLEWARE = [,"course.middleware.CourseDetailsMiddleware",
]

“无论什么语言的后端,无非“增删改查”。”

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

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

相关文章

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时&#xff0c;项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题&#xff0c;在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料&#xff0c;以为是浏览器访问权限或者是https什么证…

[力扣 Hot100]Day23 反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 出处 思路 经典考研题&#xff0c;用头插法解决。 代码 class Solution { public:ListNode* reverseList(ListNode* head) {if(!head || !head->next) return head;List…

蓝桥 第三周 分治 排序

3.1 分治法介绍及关键点解析_哔哩哔哩_bilibili 分治&#xff1a;分解 解决 合并 快速排序 单向扫描分区法 public static void main(String[] args) {// TODO Auto-generated method stubint[] arr {1,6,3,6,2,8,6,1,0,7};quickSort1(arr,0,arr.length-1);for(int i:arr) {…

shell脚本初始化mysql密码

如果你想在shell脚本中初始化MySQL的密码&#xff0c;你可以使用以下的方法。首先&#xff0c;你需要知道MySQL的root用户密码。在初始化过程中&#xff0c;你可以设置一个新的密码。 以下是一个简单的例子&#xff0c;说明如何在shell脚本中初始化MySQL的root密码&#xff1a…

Open3d计算点云法向量,可视化(代码)

Open3d使用estimate_normals函数来计算法向量。其参数设置Open3d提供了3中参数搜索的方法&#xff08;所有计算的法向量模长为1&#xff09;&#xff1a; open3d.geometry.KDTreeSearchParamKNN(knn20) # 计算近邻的20个点 open3d.geometry.KDTreeSearc…

Linux下qemu的安装并搭建虚拟arm环境(带helloworld测试)【超详细】

qemu的安装并搭建虚拟arm环境 1、准备工作1.1 安装交叉汇编工具1.2 编译内核kernel1.3 u-boot编译1.4 制作根文件系统-busybox 2、启动qemu&#xff08;arm&#xff09;3、helloworld测试 1、准备工作 1.1 安装交叉汇编工具 交叉编译器的作用就不需要详细解释了&#xff0c;因…

MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效&#xff1a; 首先未使用索引列作为查询条件索引是肯定会生效的&#xff0c;还有其他的情况&#xff0c;索引列做为了查询条件也失效了&#xff1a; ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos); 1、select 语句、order by语句&#xf…

来了来了,5000个红包封面免费领

今年公众号很慷慨&#xff0c;给长期运营的作者免费发放了6w个红包封面&#xff0c;感谢公众号平台。 往年还是自己花钱找别人设计&#xff0c;平台审核通过后才能正常发放给大家&#xff0c;自从AI绘画工具问世后&#xff0c;自己也能设计了。 下面的两个封面都是我用AI工具St…

2024.1.30报错记录

今天想调通一套github上的U-net代码&#xff0c;把报错记录一下 第一章 ModuleNotFoundError: No module named skimage 没有这个模块 pip install scikit-image 第二章 TypeError: (‘Keyword argument not understood:‘, ‘input‘) TypeError: (‘Keyword argument …

从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践

原文来源&#xff1a; https://tidb.net/blog/a38c72a4 本文作者&#xff1a;骏伯网络 唐帆&#xff0c;PingCAP 贺美存 骏伯网络简介 广州骏伯网络是一家以数据驱动的科技公司&#xff0c;聚焦移动互联网营销服务&#xff0c;坚持以客户为中心&#xff0c;深耕 APP、运营…

政安晨:示例演绎Python的列表

列表和你可以用它们做的事&#xff1a;包括索引、切片和对象变动 (变异-Mutation) 。 列表 在Python中&#xff0c;列表表示有序的值序列。以下是如何创建列表的示例&#xff1a; primes [2, 3, 5, 7] 我们可以将其他类型的元素放在列表中&#xff1a; planets [Mercury…

【C++】拷贝构造函数和赋值运算符重载详解

目录 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 ​编辑前置和后置重载 ⭐拷贝构造函数 ⭐概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象创建新…

【Java程序设计】【C00248】基于Springboot的摄影跟拍预定管理系统(有论文)

基于Springboot的摄影跟拍预定管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的摄影跟拍预定管理系统 本系统分为系统功能模块、管理员功能模块、摄影师功能模块以及用户功能模块。 系统功能模块&#xf…

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注…

【考研408】操作系统笔记

文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能&#xff08;**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**&#xff09; 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法&#xff0c;这不是一个标准的 API 方法&#xff0c;这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用&#xff0c;它可以执行一段 SQL 脚本。 例如&#xff0c;如下程序使用 executescr…

CVEMap:用于查询、浏览和搜索 CVE 的开源工具

CVEMap 是一个开源命令行界面 (CLI) 工具&#xff0c;可让您探索常见漏洞和暴露 (CVE)。它旨在提供一个简化且用户友好的界面来导航漏洞数据库。 尽管 CVE 对于查明和讨论安全漏洞至关重要&#xff0c;但它们的快速增长和偶尔夸大的严重性往往会导致误导性信息。 安全专家必须…

13:Session机制实现用户登录与注销功能-Java Web

在Java Web开发中&#xff0c;Session作为服务器端的会话管理技术&#xff0c;对于处理用户登录、状态维护及注销等场景具有至关重要的作用。本文将从理论和实践两方面出发&#xff0c;详细剖析如何使用Session机制实现用户登录与注销功能&#xff0c;并提供前后端代码示例&…

kafka排除zookeeper使用kraft的最新部署方案

kafka在新版本中已经可以不使用zookeeper进行服务部署&#xff0c;排除zookeeper的部署方案可以节省一些服务资源&#xff0c;这里使用 kafka_2.13-3.6.1.tgz 版本进行服务部署。 测试部署分为三个服务器&#xff1a; 服务器名称服务器IP地址test01192.168.56.101test02192.1…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…