开发实践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"))

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

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

相关文章

Mybatis面试题(一)

MyBatis 面试题 1、什么是 Mybatis&#xff1f; 1、Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程…

C语言天花板——指针(经典题目)

指针我们已经学习的差不多了&#xff0c;今天我来给大家分享几个经典的题目&#xff0c;来让我们相互学习&#x1f3ce;️&#x1f3ce;️&#x1f3ce;️ int main() {int a[4] { 1, 2, 3, 4 };int* ptr1 (int*)(&a 1);int* ptr2 (int*)((int)a 1);printf("%x,%…

Linux系统三剑客之grep和正则表达式的介绍(一)

1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 &#xff1f; 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用&#xff1a; 语法&#xff1a; 说明&#xff1a; 选项&#xff1a;options 重点 实例 3.后面的下次再更新。 …

Notepad++运行C语言输出乱码

方法一&#xff1a;编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码&#xff0c;我是重新输入中文 重新编译执行即可 缺陷&#xff1a;重开一个程序有中文还是会显示乱码&#xff0c;需要重新设置编码&#xff0c;比较麻烦 方法二&#xff1a;设置-首选项-新建-右侧编…

RH850P1X芯片学习笔记-Flash Memory

文章目录 FeaturesClock Supply Block DiagramFlash SizeMemory ConfigurationRegistersRegister Base AddressList of RegistersRegister Reset Condition 与Flash Memory相关的操作模式Functional OverviewOption BytesOPBT0 — Option Byte 0OPBT1 — Option Byte 1OPBT2 —…

设计模式 代理模式(静态代理 动态代理) 与 Spring Aop源码分析 具体是如何创建Aop代理的

代理模式 代理模式是一种结构型设计模式&#xff0c;它通过创建一个代理对象来控制对真实对象的访问。这种模式可以用于提供额外的功能操作&#xff0c;或者扩展目标对象的功能。 在代理模式中&#xff0c;代理对象与真实对象实现相同的接口&#xff0c;以便在任何地方都可以使…

TCP的三次握手,四次挥手

三次握手 第一次握手&#xff1a;客户端发送SYN报文&#xff0c;井发送seq为x序列号给服务端&#xff0c;等待服务端的确认第二次握手&#xff1a;服务端发送SYNACK报文&#xff0c;并发送seq为Y的序列号&#xff0c;在确认序列号为x1第三次握手&#xff1a;客户端发送ACK报文&…

群晖Drive搭建云同步服务器结合内网穿透实现Obsidian笔记文件远程多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

【征服redis6】Redis的内存淘汰详解

目录 1.redis的基本策略 2.Redis中的缓存淘汰策略 3.Redis内存不足的情况 4.几种淘汰策略的实现原理 5.项目实践与优化策略 5.1 配置案例 5.2 项目优化策略参考 数据库存储会将数据保存到磁盘中&#xff0c;而Redis的核心数据是在内存中的&#xff0c;而Redis本身主要用来…

java SECS管理系统 将逐步推出 SECS 客户端(Passive) 管理系统 SECS快速开发平台 springboot secs开发平台

SECS管理系统 这是一套SECS客户端(Passive)&#xff0c;可以直接连接PLC设备,支持Modbus、三菱MC、欧姆龙Fine、OPC-UA、西门子S7设备等通信。 企业已经有了EAP软件&#xff0c;但是设备没有SECS通信功能&#xff0c;这时候可以使用这套框架&#xff0c;直接连接设备&#xff…

数据守护盾牌:敏感数据扫描与脱敏,让安全合规无忧

前言 在信息时代&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;其价值与日俱增。然而&#xff0c;随着数据使用的普及和复杂度的提升&#xff0c;数据安全与合规问题也变得越来越突出。敏感数据的保护显得尤为重要&#xff0c;因为这些数据一旦泄露或被不当使用&a…

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)

安装node.js:(建议选择相对低一点的版本&#xff0c;相对稳定)​下载完成直接点击next即可(安装过程中会直接添加path的系统变量&#xff0c;变量值是自己的安装路径&#xff0c;可自行选择&#xff0c;比如&#xff1a;D:\software\)​安装完成:winR打开电脑控制台&#xff0c…

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

IP 地址如何进行动态分配?

由于 IP 地址资源的有限性&#xff0c;大部分用户上网都是使用动态 IP 地址&#xff0c;而不是静态 IP 地址。动态 IP 地址指的是在需要的时候才进行 IP 地址分配的方式&#xff0c;而静态 IP 地址是固定分配一个 IP 地址&#xff0c;每次都用这一个地址。因此&#xff0c;IP 地…

TikTok电商加快闭环,独享IP为运营带来哪些好处?

近日有消息称TikTok电商在加快闭环&#xff0c;以后商家可能无法继续在TikTok上为其他电商平台或独立站引流了。如今“TikTok Shop Shopping Center”平台正在构建&#xff0c;将各种购物渠道整合为一体&#xff0c;这可能是一种趋势&#xff0c;意味着TikTok逐渐从社交应用转型…

华清远见作业第二十七天——网络编程(第二天)

思维导图&#xff1a; 在虚拟机实现客户端控制机械臂 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <a.h> #define SER_PORT 8888 //服务端口 #d…

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

MetaGPT学习笔记 - task1task2

章节&#xff1a;task1&task2 一.github地址&#xff1a;github.com/geekan/MetaGPT 二.MetaGPT: 多智能体框架​ 使 GPT 以软件公司的形式工作&#xff0c;协作处理更复杂的任务 MetaGPT输入一句话的老板需求&#xff0c;输出用户故事 / 竞品分析 / 需求 / 数据结构 / A…

【PyTorch】PyTorch之Tensors索引切片篇

文章目录 前言一、ARGWHERE二、CAT、CONCAT、CONCATENATE三、CHUNK四、GATHER五、MOVEDIM和MOVEAXIS六、PERMUTE七、RESHAPE八、SELECT九、SPLIT十、SQUEEZE十一、T十二、TAKE十三、TILE十四、TRANSPOSE十五、UNBIND十六、UNSQUEEZE十七、WHERE 前言 介绍常用的PyTorch之Tenso…

【计算机网络】【新加坡南洋理工大学】【Computer Control Network】【广域网和局域网简介】【中英对照(自译)】

一、说明 仅供学习使用。 二、广域网&#xff08;WAN&#xff09;和局域网&#xff08;LAN&#xff09;简介