开发实践6_project

news2024/11/26 16:40:15

要求:

① 页面写入超链接,获取所有数据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 datetime

from django.core.paginator import Paginator, InvalidPage
from django.shortcuts import render
from django.views.decorators.cache import cache_page

from djangoProject.settings import PAGE_SIZE
from pro6_app.models import Department


def 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 path

from .views import *

app_name = "pro6"

urlpatterns = [
    path('home/', home, name="home"),
    path('show/', show, name="show"),
]

models //

# 迁移,添加测试数据

from django.db import models


class 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'

    @classmethod
    def get_all(cls):
        return cls.objects.all()

admin //

from django.contrib import admin

from pro6_app.models import Department

models = [
    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

    @classmethod
    def 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)

    @classmethod
    def 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 = token
            user.save()
            response = redirect(reverse('pro6:test'))
            response.set_cookie("user_token", token)
            return response
        else:
            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.coloradmin.cn/o/1393316.html

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

相关文章

web前端项目-贪吃蛇小游戏【附源码】

web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏&#xff0c;采用HTML、CSS和JavaScript技术进行开发&#xff0c;玩家通过控制一条蛇在地图上移动&#xff0c;蛇的目的是吃掉地图上的食物&#xff0c;并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&am…

C++(12)——string

目录 1.insert: 1.1 string& insert (size_t pos, const string& str)&#xff1a; 1.2 string& insert (size_t pos, const char* s)&#xff1a; 1.3 string& insert (size_t pos, const char* s, size_t n)&#xff1a; 1.4 string& insert (…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 &#xff08;1&#xff09;stack是一种容…

Baichuan2百川模型部署的bug汇总

1.4bit的量化版本最好不要在Windows系统中运行&#xff0c;大概原因报错原因是bitsandbytes不支持window&#xff0c;bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存&#xff0c;offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…

包含广告或宣传性质的内容或参考资料不对应,百度百科词条怎么改

想要修改百度百科词条&#xff0c;却发现在编辑百度百科词条时经常提示“包含广告或宣传性质的内容”&#xff0c;又或者经常遇到“参考资料不对应”的情况&#xff0c;我们该如何正确修改百度百科词条才能推广&#xff0c;洛希爱做百科网为大家分享。 修改百科百度百科词条提示…

基于SSM的校园闲置物品交易平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

nexus3 npm-hosted仓库迁移

迁移背景&#xff1a; 从nexus 3.33 升级到 nexus 3.64 过程中&#xff0c;私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储&#xff0c;无法单独拆除去&#xff0c;所以采用迁移的方式 迁移思路&#xff1a; down下来 npm-hosted 仓库&am…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

【征服redis8】Redis的AOF持久化

Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF&#xff08;Append Only File&#xff09;机制是一种常用的持久化方式&#xff0c;它记录了所有对 Redis 数据库进行修改的命令&#xff0c;在 Redis 重启时可以使…

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中&#xff0c;前端通过以下三种方式来与后端进行交互&#x1f31f; ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对&#xff0c;一般用doGet方法进行交互 代码如下 …

读AI3.0笔记02_起源

1. 起源 1.1. 1955年&#xff0c;28岁的麦卡锡进入了达特茅斯学院的数学系 1.2. 该领域的正式确立可以追溯到1956年由一位名叫约翰麦卡锡的年轻数学家在达特茅斯学院举办的一场小型研讨会 1.2.1. 在1956年&#xff0c;即便是最先进的计算机&#xff0c;其速度也达不到现代智…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块&#xff08;module&#xff09;中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法&#xff0c;我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

用CHAT分析高校体育智慧教学体系构建与探索研究现状

CHAT回复&#xff1a;现阶段&#xff0c;高校体育智慧教学体系的构建与探索研究还处于初级阶段&#xff0c;但全球数字化转型大潮的推动下&#xff0c;一些较为前沿的研究和实践已经开始出现&#xff1a; 1.教学平台的建设&#xff1a;很多高校已经开始尝试使用在线教育平台进行…

web蓝桥杯真题--9、水果拼盘

介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.css ├── im…

【计算机图形学】习题课:Viewing

【计算机图形学】Viewing 部分问题与解答 CS100433 Computer Graphics Assignment 21 Proof the composed transformations defined in global coordinate frame is equivalent to the composed transformations defined in local coordinate frame but in different composing…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的&#xff0c;每个网络上都有许多主机&#xff0c;这样便构成了一个有层次的结构。 IP 地…

新品发布 | 思腾合力深思系列「IW4235-4GRc」4U机架式高性能服务器

新品发布 | 思腾合力深思系列「IW4235-4GRc」4U机架式高性能服务器 Sitonholy 思腾合力 2024-01-17 17:35 发表于北京 采用第4/5代Intel Xeon 可扩展处理器 4U标准的机架式高性能服务器 极致性能提升 支持第4/5代Intel Xeon 可扩展处理器&#xff0c;CPU 3 UPI性能高达16 GT/s…

重置aws上的ssh默认登录端口

aws上的ec2机器&#xff0c;默认ssh的登录都是22&#xff0c;为了防止被黑&#xff0c;记录下修改该默认端口的方法 修改/etc/ssh/sshd_config文件,将Port 22注释去掉在上面的文件中&#xff0c;加入一行&#xff0c;你想要增加的端口号&#xff0c;格式和22一致注意&#xff1…

云原生场景下,AIGC 模型服务的工程挑战和应对

作者&#xff1a;徐之浩、车漾 “成本”、“性能”和 “效率”正在成为影响大模型生产和应用的三个核心因素&#xff0c;也是企业基础设施在面临生产、使用大模型时的全新挑战。AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。 大模型推理对基础设施带来…