开发实践6_project

这篇具有很好参考价值的文章主要介绍了开发实践6_project。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要求:

① 页面写入超链接,获取所有数据item,显示在另一个页面,1min内,即使数据有变化,页面内容不变,1min后点击超链接可获取最新信息;

② 使用middleware完成用户请求路径判断 (request.path)。如果是“/schedule/select/”或“/select/contact/”,判断是否用户登录,否 则重定向到login页面。

结果:

开发实践6_project,前端,sql开发实践6_project,前端,sql

代码:

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按钮,会跳转到登录页面

开发实践6_project,前端,sql开发实践6_project,前端,sql

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

开发实践6_project,前端,sql开发实践6_project,前端,sql开发实践6_project,前端,sql开发实践6_project,前端,sql

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

开发实践6_project,前端,sql

代码:

(沿用上述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注册文章来源地址https://www.toymoban.com/news/detail-800758.html

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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《前端开发 实践之 构建工具的了解》

    前端构建工具之一:vite vue官方;打包工具;vue 项目本地构建部署工具 类似的前端项目打包工具还有:webpack等等 与其他打包工具区别可能有这几个方面:打包所消耗时间(打包速度) vue 脚手架:vue-cli 可以本地初始化项目,我们也可以使用 Vite 替代脚手架创建项目 基本使

    2024年02月14日
    浏览(26)
  • 【区块链 | 前端】前端开发人员入门区块链的最佳实践

    前端开发人员入门区块链的最佳实践 从技术入门一个行业通常是漫无目的,个人认为正确的入行区块链的方式是去了解他的背景,是去建立自己信仰的,尤其身处一个刚起步就被扼杀的行业,我们每个人都是领头人,我们需要坚信这个行业是有未来的,当然我们不能去神话他

    2023年04月09日
    浏览(43)
  • TypeScript 在前端开发中的应用实践

    TypeScript 已经成为前端开发领域越来越多开发者的首选工具。它是一种静态类型的超集,由 Microsoft 推出,为开发者提供了强大的静态类型检查、面向对象编程和模块化开发的特性,解决了 JavaScript 的动态类型特性带来的一些问题。 在本篇博文中,我们将深入探讨 TypeScript 在

    2024年02月15日
    浏览(30)
  • 前端开发中地图定位与距离计算的应用实践

    前端开发中地图定位与距离计算的应用实践 在前端开发中,地图功能的应用日益广泛,无论是用户位置的定位、目标距离的计算,还是地址的解析与展示,地图都发挥着不可替代的作用。本文将重点介绍前端开发中实现地图定位、距离计算以及地址解析的方法,并以腾讯地图

    2024年04月11日
    浏览(28)
  • Gerrit常见命令及最佳实践,学习前端开发经验

    git clone ssh://tusi@xx.xx.cn:29428/project-name 如果使用了 Git 代理,请将 xx.xx.cn:29428 换成代理后的 ip:port git clone ssh://tusi@ip:port/project-name 创建develop分支 ============================================================================== 一般我们不会将代码直接提交到 master 分支,而是会选择在 develop 分支进

    2024年04月28日
    浏览(20)
  • Python中的Web前端开发技术与实践

    Python是一种广泛使用的编程语言,可以用于Web开发。在Python中进行Web前端开发,可以使用多种技术和框架。以下是一些常用的技术和框架: Django:Django是一个高级Python Web框架,它鼓励快速开发和干净的设计。Django包括一个完整的开发工具集,包括模板引擎、表单处理、认证

    2024年01月24日
    浏览(35)
  • 前端桌面应用开发实践:Electron入门指南

    随着互联网的快速发展,前端开发不再局限于网页应用,而是逐渐涉及到桌面应用的开发。Electron作为一种流行的前端桌面应用开发框架,为开发者提供了一种快速构建跨平台桌面应用的方式。本文将介绍Electron的基本概念和使用方法,并通过一个简单的示例来说明其开发实践

    2024年02月11日
    浏览(39)
  • 浅谈 ByteHouse Projection 优化实践

    预聚合是 OLAP 系统中常用的一种优化手段,在通过在加载数据时就进行部分聚合计算,生成聚合后的中间表或视图,从而在查询时直接使用这些预先计算好的聚合结果,提高查询性能,实现这种预聚合方法大多都使用物化视图来实现。 Clickhouse 社区实现的 Projection 功能类似于

    2024年02月08日
    浏览(25)
  • 【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月12日
    浏览(63)
  • 前端工程化实战:React 模块化开发、性能优化和组件化实践

    前端工程化实战是指通过组织工作流程、使用工具和技术来提高前端开发效率和质量的一种方法。常见的前端工程化实践包括模块化开发、自动化构建、代码检查和测试、性能优化等。下面将简要介绍模块化开发、性能优化和组件化实践。 模块化开发 在 React 中实现模块化开

    2023年04月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包