开发实践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.mzph.cn/news/631351.shtml

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

相关文章

一篇综述洞悉医学大型语言模型的原理,应用和挑战

在过去的一年中&#xff0c;随着 GPT-4、LLaMA、Mistral&#xff0c;PaLM 等先进技术的突飞猛进&#xff0c;大型语言模型&#xff08;Large Language Models&#xff09;已经引领全球人工智能进入了一个全新的基础模型时代&#xff0c;这一时代不仅开启了技术创新的新篇章&…

微信小程序vue+uniapp瑜伽馆课程预约选课管理系统

本文对该站点以及对其进行了全面的剖析&#xff0c;为瑜伽馆管理系统的发展带来了借鉴。瑜伽馆管理系统小程序对于瑜伽馆起到了很好的引导作用&#xff0c;特别是对于地方瑜伽馆的处理起到了很大的作用。 按照已有的功能&#xff0c;除了管理员外&#xff0c;还可以对系统中的全…

python高级练习题库实验2(B)部分

文章目录 题目1代码实验结果题目2代码实验结果题目总结题目1 注册课程小游戏程序 研究下面的例子,并编写一个与这些例子完全相同的程序。使用for loop和break来解决问题。提示用户输入课程数量,是否选择,并且课程代码,最后还需显示已经完成的课程注册数量或者未完成的注册…

【Python3】【力扣题】389. 找不同

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;使用计数器分别统计字符串中的元素和出现次数&#xff0c;两个计数器相减&#xff0c;结果就是新添加的元素。 知识点&#xff1a;collections.Counter(...)&#xff1a;字典子类&#x…

Python算法例36 丑数Ⅱ

1. 问题描述 设计一个算法&#xff0c;找出只含素因子2、3、5的第n小的数&#xff0c;符合条件的数如&#xff1a;1、2、3、4、5、6、8、9、10、12… 2. 问题示例 如果n9&#xff0c;返回10。 3. 代码实现 def find_nth_number(n):if n < 0:return Nonenumbers [1]idx…

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

【playwright】新一代自动化测试神器playwright+python系列课程22_playwright模拟鼠标操作_悬停_右击_双击

playwright模拟鼠标操作_悬停_右击_双击 鼠标悬停 – hover() 有些元素&#xff0c;只有你鼠标移动到它那个位置上&#xff0c;他才会展开或者显示一些内容&#xff0c;这时候就要用到hover()操作了。 以个人设置这个下拉菜单&#xff0c;来看一下hover的使用。 项目实践代…

产品排名提升秘籍:亚马逊鲲鹏系统的独特优势

在亚马逊竞争激烈的市场中&#xff0c;商家们一直在寻找新的方法来提升产品排名和吸引更多的顾客。近期&#xff0c;一款名为“亚马逊鲲鹏系统”的全自动化运行软件引起了广泛关注。该软件集成了一系列独特的功能和特点&#xff0c;旨在帮助商家更轻松地管理其亚马逊业务&#…

企业微信无法正常启动 报错0xc0000142

报错内容如下&#xff0c;每次打开工作电脑时候企业微信一般会正常启动&#xff0c;但是有时候经常会出现下面这种错误&#xff0c;重启也解决不了&#xff0c;每次都得重装企业微信&#xff0c;今天整理了一下网上的方法&#xff0c;这个原因大概率是亿赛通。 解决办法&#x…

2024年网络安全比赛--内存取证(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.从内存文件中找到异常程序的进程&#xff0c;将进程的名称作为Flag值提交&#xff1b; 2.从内存文件中找到黑客将异常程序迁移后的进程编号&#xff0c;将迁移后的进程编号作为Flag值…

Python学习之路——异常捕获

一、什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是bug 二、异常的捕获方法 当我们的程序遇到bug&#xff0c;那么就下来有两种情况 ①整个程序因为一个…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

chromedriver+Selenium+springboot+Java实现后端截图

chromedriver这种方法实现截图&#xff0c;依赖服务器端的谷歌浏览器软件&#xff0c;需要在服务器端下载谷歌浏览器。 Windows服务器说明 1.下载谷歌浏览器 2.根据第一步下载的谷歌浏览器版本&#xff0c;下载chromedriver&#xff0c;可以在这个页面找到和版本相近的版本去下…

docker部署Jira+配置MySQL8数据库

写在前面&#xff1a;如果你通过docker安装Jira且启动过&#xff0c;然后你现在又想使用mysql数据库&#xff0c;需要注意 你除了停掉原有容器&#xff0c;还需要删除&#xff1a;/var/lib/docker/volumes/jiraVolume/_data下的文件&#xff0c;否则启动后会无法正常使用。注意…

Redis 笔记一

概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习&#xff1a;Redis 教程 | 菜鸟教程 1.Redis为什…

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了&#xff0c;或者呢突然不自觉软件界面乱了&#xff0c;或者一些窗口打开却找不到&#xff01; 这时候可以去删除arcgis的界面配置文件&#xff0c;Normal.mxt 删除后再打开软件&#xff0c;软件界面就会回到初始化设置了&#xff01; 文件所在的路径&…

从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!

介绍&#xff1a;Apache Zeppelin是一个基于Web的交互式开发系统&#xff0c;主要用于进行大数据可视化分析。其核心概念是notebook&#xff0c;所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案&#xff0c;支持数据采集、数据发现、数据分析…

canal server初始化源码分析

CanalLauncher类是canal server端启动的入口类&#xff0c;跟随代码进行深入。 在开始之前&#xff0c;我们可以先了解下&#xff0c; canal 配置方式 ManagerCanalInstanceGenerator&#xff1a; 基于manager管理的配置方式&#xff0c;实时感知配置并进行server重启Spring…

k8s---ingress对外服务(七层)

ingress 概念 k8s的对外服务&#xff0c;ingress service作用现在两个方面&#xff1a; 1、集群内部&#xff1a;不断跟踪的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部&#xff1a;类似于负载均衡器&a…

elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询

ES-DSL查询语法&#xff08;全文检索、精准查询、地理坐标查询&#xff09; 1.DSL查询文档 elasticsearch 的查询依然是基于 JSON 风格的 DSL 来实现的。 1.1.DSL 查询分类 Elasticsearch 提供了基于 JSON 的 DSL&#xff08;Domain Specific Language&#xff09;来定义查…