柚子快報(bào)激活碼778899分享:前端 sql 開發(fā)實(shí)踐6
柚子快報(bào)激活碼778899分享:前端 sql 開發(fā)實(shí)踐6
要求:
① 頁面寫入超鏈接,獲取所有數(shù)據(jù)item,顯示在另一個(gè)頁面,1min內(nèi),即使數(shù)據(jù)有變化,頁面內(nèi)容不變,1min后點(diǎn)擊超鏈接可獲取最新信息;
② 使用middleware完成用戶請(qǐng)求路徑判斷 (request.path)。如果是“/schedule/select/”或“/select/contact/”,判斷是否用戶登錄,否 則重定向到login頁面。
①
結(jié)果:
代碼:
python manage.py startapp pro6_app
注冊(cè)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 //
#?遷移,添加測(cè)試數(shù)據(jù)
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 //
depar | month | year | remarks |
---|---|---|---|
{{ i.name }} | {{ i.month }} | 2024 | null |
{% if data.has_previous %}
{% else %}
{% endif %}
{{ data.number }}/{{ paginator.num_pages }}
{% if data.has_next %}
{% else %}
{% endif %}
Help with scheduling troubles.
Have a nice day.
{{ time|date:'H:i:s Y-m-d' }}. Shanghai, China, Asia.
②
結(jié)果:
1)未登錄直接進(jìn)入test頁面的contact或select按鈕,會(huì)跳轉(zhuǎn)到登錄頁面
2)正常流程:注冊(cè)成功→登錄成功→test頁面可select或contact(setting設(shè)置token過期時(shí)間是1day)
admin后臺(tái)可見保存的加密后的token即pwd,沒有保存用戶原始密碼。
代碼:
(沿用上述pro6_app, 已注冊(cè))
models //
# admin 注冊(cè)
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 = "網(wǎng)頁用戶"
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("
Wrong Info..
")def test_view(request):
return render(request, "pro6_test.html")
def contact_view(request):
return HttpResponse("
get in touch
")def select_view(request):
return HttpResponse("
select it
")def del_user_token(request):
response = redirect(reverse('pro6:test'))
response.delete_cookie("user_token")
return response
templates //
register
login
test
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注冊(cè)
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"))
柚子快報(bào)激活碼778899分享:前端 sql 開發(fā)實(shí)踐6
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。