开发实践6_project
要求:
① 页面写入超链接,获取所有数据item,显示在另一个页面,1min内,即使数据有变化,页面内容不变,1min后点击超链接可获取最新信息;
② 使用middleware完成用户请求路径判断 (request.path)。如果是“/schedule/select/”或“/select/contact/”,判断是否用户登录,否 则重定向到login页面。
①
结果:


代码:
python manage.py startapp pro6_app
注册app
path('pro6/', include('pro6_app.urls', namespace="pro6")),
views //
import datetimefrom django.core.paginator import Paginator, InvalidPage
from django.shortcuts import render
from django.views.decorators.cache import cache_pagefrom djangoProject.settings import PAGE_SIZE
from pro6_app.models import Departmentdef home(request):return render(request, "home.html")@cache_page(60)
def show(request):ds = Department.get_all()page_num = request.GET.get("page_num", default=1)paginator = Paginator(ds, PAGE_SIZE)try:data = paginator.page(page_num)except InvalidPage:data = paginator.page(1)time = datetime.datetime.now()return render(request, "show.html", {"data": data, "paginator": paginator, "time": time})
setting //
PAGE_SIZE = 3
urls //
from django.urls import pathfrom .views import *app_name = "pro6"urlpatterns = [path('home/', home, name="home"),path('show/', show, name="show"),
]
models //
# 迁移,添加测试数据
from django.db import modelsclass Department(models.Model):name = models.CharField(max_length=64, verbose_name="科室")month = models.CharField(max_length=2, verbose_name="月")def __str__(self):return f"{self.name}__{self.month}"class Meta:verbose_name = "安排表"verbose_name_plural = verbose_name + 's'@classmethoddef get_all(cls):return cls.objects.all()
admin //
from django.contrib import adminfrom pro6_app.models import Departmentmodels = [Department
]admin.site.register(models)
templates //
<head><meta charset="UTF-8"><title>home</title>
</head>
<body>
<a href="{% url 'pro6:show' %}"><input type="button" value="Get data">
</a>
</body>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Depars</title>
</head>
<body>
<table border="1" align="center" cellpadding="0" cellspacing="0"><thead><tr><th>depar</th><th>month</th><th>year</th><th>remarks</th></tr></thead>{% for i in data %}<tr><td>{{ i.name }}</td><td>{{ i.month }}</td><td>2024</td><td>null</td></tr>{% endfor %}
</table>
<center><a href="{% url 'pro6:show' %}?page_num=1" style="color:orangered">First</a>{% if data.has_previous %}<a href="{% url 'pro6:show' %}?page_num={{ data.previous_page_number }}" style="color:orangered">Previous</a>{% else %}<a href="javascript:alert('We are at the beginning.')">Previous</a>{% endif %}{{ data.number }}/{{ paginator.num_pages }}{% if data.has_next %}<a href="{% url 'pro6:show' %}?page_num={{ data.next_page_number }}" style="color:orangered">Next</a>{% else %}<a href="javascript:alert('Boundary of the void.')">Next</a>{% endif %}<a href="{% url 'pro6:show' %}?page_num={{ paginator.num_pages }}" style="color:orangered">Last</a>
</center>
<center>
<a href="{% url 'pro6:show' %}"><input type="button" value="Refresh">
</a>
<hr>
<h6>Help with scheduling troubles.</h6>
<h6>Have a nice day.</h6>
<h6>{{ time|date:'H:i:s Y-m-d' }}. Shanghai, China, Asia.</h6></center>
</body>
</html>
②
结果:
1)未登录直接进入test页面的contact或select按钮,会跳转到登录页面


2)正常流程:注册成功→登录成功→test页面可select或contact(setting设置token过期时间是1day)




admin后台可见保存的加密后的token即pwd,没有保存用户原始密码。

代码:
(沿用上述pro6_app, 已注册)
models //
# admin 注册
class User(models.Model):name = models.CharField(max_length=32, unique=True, verbose_name="Name")pwd = models.CharField(max_length=128, verbose_name="Password")token = models.CharField(max_length=128, null=True)class Meta:verbose_name = "网页用户"verbose_name_plural = verbose_name + '们'def __str__(self):return self.name@classmethoddef get_list(cls, **kwargs):filters = {}if kwargs.get("name"):filters["name"] = kwargs.get("name")if kwargs.get("pwd"):filters["pwd"] = kwargs.get("pwd")if kwargs.get("token"):filters["token"] = kwargs.get("token")return cls.objects.filter(**filters)@classmethoddef create_one(cls, **kwargs):return cls.objects.create(name=kwargs.get("name"),pwd=kwargs.get("pwd"))
views //
# SESSION_COOKIE_AGE = 3600 * 24 # 60 * 60 * 24
def register(request):if request.method == "GET":return render(request, "pro6_regis.html")if request.method == "POST":name = request.POST.get("name")pwd = hash(request.POST.get("pwd"))User.create_one(**{"name": name, "pwd": pwd})return redirect(reverse('pro6:login'))def login(request):if request.method == "GET":return render(request, "pro6_login.html")if request.method == "POST":name = request.POST.get("name")pwd = hash(request.POST.get("pwd"))filters = {"name": name,"pwd": pwd}users = User.get_list(**filters)if users:user = users.first()md5 = hashlib.md5()md5.update(name.encode("utf-8"))token = md5.hexdigest() + str(time.time())user.token = tokenuser.save()response = redirect(reverse('pro6:test'))response.set_cookie("user_token", token)return responseelse:return HttpResponse("<h5 style='color: orange'>Wrong Info..</h5>")def test_view(request):return render(request, "pro6_test.html")def contact_view(request):return HttpResponse("<h5 style='color:orange'>get in touch</h5>")def select_view(request):return HttpResponse("<h5 style='color:orange'>select it</h5>")def del_user_token(request):response = redirect(reverse('pro6:test'))response.delete_cookie("user_token")return response
templates //
register
<form action="" method="post">{% csrf_token %}UserName:<input type="text" name="name"> <br>Password:<input type="password" name="pwd"> <br><input type="submit" value="Register">
</form>
login
<form action="" method="post">{% csrf_token %}UserName:<input type="text" name="name"> <br>Password:<input type="password" name="pwd"> <br><input type="submit" value="Login">
</form>
test
<body>
<a href="{% url 'pro6:select' %}">select it</a>
<br>
<a href="{% url 'pro6:contact' %}">contact it</a>
<br>
<a href="{% url 'pro6:del' %}" style='color:purple' >delete user token</a>
</body>
urls //
path('regis/', register, name="regis"),path('login/', login, name="login"),path('test/', test_view, name="test"),path('schedule/contact/', contact_view, name='contact'),path('schedule/select/', select_view, name='select'),path('del/', del_user_token, name='del'),
middleware //
# setting注册
class LoginMiddleWare(MiddlewareMixin):def process_request(self, request):target_path = ['/pro6/schedule/select/','/pro6/schedule/contact/']print(request.path)if request.path in target_path:print('in judge flag')try:user_token = request.COOKIES["user_token"]users = User.get_list(token=user_token)print('verified')if not users:return HttpResponse("Token expired.")except:return redirect(reverse("pro6:login"))
相关文章:
开发实践6_project
要求: ① 页面写入超链接,获取所有数据item,显示在另一个页面,1min内,即使数据有变化,页面内容不变,1min后点击超链接可获取最新信息; ② 使用middleware完成用户请求路径判断 &am…...
HCIP----MGRE实验
实验要求: 第一步,基本的IP地址配置 R1: [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 #配置PC的网关 [R1]int Serial 4/0/0 [R1-Serial4/0/0]link-protocol hdlc #R1和R2之间采用hdlc封装 [R1-S…...
STM32标准库开发——PWM驱动代码
PWM驱动初始化代码 使能定时器二时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);设置定时器时钟源 TIM_InternalClockConfig(TIM2);配置定时器二的时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_D…...
postman导入https证书
进入setting配置中Certificates配置项 点击“Add Certificate”,然后配置相关信息 以上配置完毕,如果测试出现“SSL Error:Self signed certificate” 则将“SSL certificate verification”取消勾选...
Spark UI中 Shuffle Exchange 和 BroadcastExchange 中的 dataSize 值为什么不一样
背景 Spark 3.5 最近在看Spark UI 上的一些指标看到一个很有意思的东西, 相邻的Shuffle Exechange 和 BroadcastExechange 中的 datasize 居然不一样, 前者为 765KB, 后者为 64.5MB。差别还不少,中间就增加了一个 AQEShuffleRead 计划 结论 Shuffle E…...
阿里云优惠券领取入口、使用方法和限制条件,2024最新
阿里云优惠代金券领取入口,阿里云服务器优惠代金券、域名代金券,在领券中心可以领取当前最新可用的满减代金券,阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法: 阿里云优惠券…...
自己构建webpack+vue3+ts
先看看我的目录结构(我全局使用TS): 一、安装配置webpack打包 安装esno npm install esnoesno 是基于 esbuild 的 TS/ESNext node 运行时,有了它,就可以直接通过esno *.ts的方式启动脚本,package.json中添加 type:…...
【AI】小白入门笔记
前言 2024年,愿新年胜旧年!作为AI世界的小白,今天先来从一些概念讲起,希望路过的朋友们多多指教! 正文 AI (人工智能) 提起AI, 大家可能会想起各种机器人,移动手机的“Siri”,"小爱同学", 是语…...
GPT应用开发:编写插件获取实时天气信息
欢迎阅读本系列文章!我将带你一起探索如何利用OpenAI API开发GPT应用。无论你是编程新手还是资深开发者,都能在这里获得灵感和收获。 本文,我们将继续展示聊天API中插件的使用方法,让你能够轻松驾驭这个强大的工具。 插件运行效…...
揭开Spring MVC的真面目
官方对于Spring MVC的描述为: Spring Web MVC是基于Servlet API框架构建的原始Web框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring-MVC…...
AI大模型开发架构设计(3)——如何打造自己的大模型
文章目录 如何打造自己的大模型1 新时代职场人应用AIGC的5重境界2 人人需要掌握的大模型原理职场人都能听懂的大语音模型的训练过程职场人都能听得懂的大语言模型的Transformer推理过程 3 如何构建自己的大模型需要具备三个方面的能力LangChain是什么?LangChain主要…...
Linux C语言开发(三)运算符和表达式
目录 一.什么是运算符 二.什么是表达式 一.什么是运算符 在C语言中,运算符是用于执行特定操作的符号。这些操作可以涉及一个或多个值(称为操作数),并产生一个新的值或效果。C语言提供了多种类型的运算符,用于执行算术、比较、逻辑和其他类型的操作。 以下是C语言中常见的…...
Spring-AOP入门案例
文章目录 Spring-AOP入门案例概念:通知(Advice)切入点(Pointcut )切面(Aspect) 目标对象(target)代理对象(Proxy)顾问(Advisor)连接点(JoinPoint) 简单需求:在接口执行前输出当前系统时间Demo原始未添加aop前1 项目包结构2 创建相…...
中仕教育:国考调剂和补录的区别是什么?
国考笔试成绩和进面名单公布之后,考生们就需要关注调剂和补录了,针对二者之间的区别很多考生不太了解,本文为大家解答一下关于国考调剂和补录的区别。 1.补录 补录是在公式环节之后进行的,主要原因是经过面试、体检和考察&#…...
ESP32-TCP服务端(Arduino)
将ESP32设置为TCP服务器 介绍 TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的(一个客户端对应一个服务端)、可靠的传输层协议。在TCP的工作原理中,它会将消息或文件分解为更小的片段&a…...
HCIA-HarmonyOS设备开发认证-序
序 最近涉及到HarmonyOS鸿蒙系统设备开发,在网络上已经有很多相关资料,视频教程,我也移植了公司的一个stm32G474板卡,运行LiteOS-m L0系统。 一面看资料一面移植,遇到不少坑,当看到运行的LOGO时࿰…...
Med-YOLO:3D + 医学影像 + 检测框架
Med-YOLO:3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码:加强小目标检测总结 提出背景 论文链接:https://arxiv.org/abs/2312.07729 代码链接:https://github.com/JDSobek/MedYOLO 提出背景&…...
Docker部署Golang服务
不管是开发还是生产环境,通过 docker 方式部署服务都是一种不错的选择,能够解决不同开发环境一致性的问题。 本文以项目:https://github.com/johncxf/go-api 为例。 Dockerfile 构建 Go 运用环境 在项目根目录下添加 Dockerfile 文件&…...
C#,字符串匹配(模式搜索)Sunday算法的源代码
Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。 核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配&…...
makefile 编译动态链接库使用(.so库文件)
makefile 编译动态链接库使用(.so库文件) 动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态&#…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
