《python编程从入门到实践》day40
# 昨日知识点回顾
编辑条目及创建用户账户
暂没能解决bug:
The view learning_logs.views.edit_entry didn't return an HttpResponse object. It returned None instead.
# 今日知识点学习
19.2.5 注销
提供让用户注销的途径
1.在base.html中添加注销链接
# base.html
<p><a href = "{% url 'learning_logs:index' %}">Learning Log</a> -<a href = "{% url 'learning_logs:topics' %}">Topics</a> -{% if user.is_authenticated %}Hello, {{ user.username }}.<a href="{% url 'users:logout' %}">Log out</a>{% else %}<a href="{% url 'users:login' %}">Log in </a>{% endif %}
</p>{% block content %}{% endblock content %}
2.注销确认页面
# learning_log\users\templates\registration\logged_out.html
{% extends "learning_logs/base.html" %}{% block content %}<p>You have been logged out. Thank you for visiting!</p>
{% endblock content %}
19.2.6 注册页面
1.注册页面的URL模式
# users\urls.py
"""为应用程序users定义URL模式"""from django.urls import path, includefrom . import viewsapp_name = 'users'
urlpatterns = [# 包含默认的身份验证URLpath('', include('django.contrib.auth.urls')),# 注册页面path('register/', views.register, name='register')
]
2.视图函数register()
# # users\views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm# Create your views here.
def register(request):"""注册新用户"""if request.method != 'POST':# 显示空的注册表单form = UserCreationForm()else:# 处理填写好的表单form = UserCreationForm(data=request.POST)if form.is_valid():new_user = form.save()# 让用户自动登录,再重定向主页login(request, new_user)return redirect('learning_logs:index')# 显示空表单或指出表单无效context = {'form': form}return render(request, 'registration/register.html', context)
3.注册模版
# users\templates\registration\register.html
{% extends "learning_logs/base.html" %}{% block content %}<form method='post' action="{% url 'users:register' %}" >{% csrf_token %}{{ form.as_p }}<button name="submit">Register</button><input type="hidden" name="next"value="{% url 'learning_logs:index' %}" /> </form>{% endblock content %}
4.链接到注册页面
# base.html
<p><a href = "{% url 'learning_logs:index' %}">Learning Log</a> -<a href = "{% url 'learning_logs:topics' %}">Topics</a> -{% if user.is_authenticated %}Hello, {{ user.username }}.<a href="{% url 'users:logout' %}">Log out</a>{% else %}<a href="{% url 'users:register' %}">Register </a>-<a href="{% url 'users:login' %}">Log in </a>{% endif %}
</p>{% block content %}{% endblock content %}
19.3 让用户拥有自己的数据
19.3.1 使用@login_required限制访问
装饰器:放在函数定义前面的指令,能在函数运行前修改函数代码
1.限制访问显示所有主题的页面
# learning_logs/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required# 导入所需数据相关联的模型
from .models import Topic, Entry
from .forms import TopicForm, EntryForm# Create your views here.
def index(request):"""学习笔记的主页"""# 传递两个实参:对象request以及一个可用于创建页面的模版return render(request, 'learning_logs/index.html')@login_required
def topics(request):"""显示所有的主题"""topics = Topic.objects.order_by('date_added')
---snip---
# settings.py
---snip(直到末尾)---# 我的设置
LOGIN_URL = 'users:login'
2.全面限制对项目“学习笔记”的访问
# learning_logs\views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required# 导入所需数据相关联的模型
from .models import Topic, Entry
from .forms import TopicForm, EntryForm# Create your views here.
def index(request):"""学习笔记的主页"""# 传递两个实参:对象request以及一个可用于创建页面的模版return render(request, 'learning_logs/index.html')@login_required
def topics(request):"""显示所有的主题"""topics = Topic.objects.order_by('date_added')# 定义一个将要发送模版的上下文context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)@login_required
def topic(request, topic_id):"""显示单个主题"及所有的条目"""topic = Topic.objects.get(id=topic_id)entries = topic.entry_set.order_by('-date_added')context = {'topic': topic, 'entries': entries}return render(request, 'learning_logs/topic.html', context)@login_required
def new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据:对数据进行处理form = TopicForm(data=request.POST)if form.is_valid():form.save()return redirect('learning_logs:topics')# 显示空表单后指出表单数据无效context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)@login_required
def new_entry(request, topic_id):"""在特定主题中添加新条目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交数据:创建一个空表单form = EntryForm()else:# POST提交的数据:对数据进行处理form = EntryForm(data=request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return redirect('learning_logs:topic', topic_id=topic_id)# 显示空表单或支出表单数据无效context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)@login_required
def edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif request.method != 'POST':# 初次请求:使用当前条目填充表单form =EntryForm(instance=entry)else:# POST提交的数据:对数据进行处理form = EntryForm(instance=entry, data=request.POST)if form.is_valid():form.save()return redirect('learning_logs:topic', topic_id=topic.id)context = {'entry': entry, 'topic': topic, 'form': form}return render(request, 'learning_logs/edit_entry.html', context)
19.3.2 将数据关联到用户
1.修改模型Topic
# models.py
from django.db import models
from django.contrib.auth.models import User# Create your models here.
class Topic(models.Model):"""用户学习的主题"""# 存储少量文本如名称、标题或城市,预留200字符空间text = models.CharField(max_length=200)# 记录日期和时间的数据,为True自动设置为当前日期和时间date_added = models.DateTimeField(auto_now_add=True)owner = models.ForeignKey(User, on_delete=models.CASCADE)def __str__(self):"""返回模型的字符串表示"""# 只显示条目前50字符,省略号指出显示的并非整个条目return f"{self.text[:50]}..."class Entry(models.Model):"""学到某个主题的具体知识"""topic = models.ForeignKey(Topic, on_delete=models.CASCADE)# 外键(foreign key)是一个数据库术语,它指向数据库另一条记录。# 次联删除:on_delete=models.CASCADE让Django在删除主题的同时删除所有与之相关联的条目text = models.TextField()date_added = models.DateTimeField(auto_now_add=True)class Meta:# 存储用于管理模型的额外信息verbose_name_plural = 'entries'
2. 确定当前有哪些用户
3.迁移数据库
重建数据库:python manage.py flush
19.3.3 只允许用户访问自己的主题
# views.py
---snip---
@login_required
def topics(request):"""显示所有的主题"""topics = Topic.objects.filter(owner=request.user).order_by('date_added')# 定义一个将要发送模版的上下文context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)
---snip---
19.3.4 保护用户的主体
# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import Http404---snip---@login_required
def topic(request, topic_id):"""显示单个主题"及所有的条目"""topic = Topic.objects.get(id=topic_id)# 确认请求的主题属于当前用户if topic.owner != request.user:raise Http404---snip---
19.3.5 保护页面edit_entry
# views.py
---snip---
@login_required
def edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif topic.owner != request.user:raise Http404---snip---
19.3.6 将新主题关联到当前用户
# views.py
---snip---
@login_required
def new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据:对数据进行处理form = TopicForm(data=request.POST)if form.is_valid():new_topic = form.save(commit=False)new_topic.owner = request.usernew_topic.save() return redirect('learning_logs:topics')# 显示空表单后指出表单数据无效context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)---snip---
相关文章:

《python编程从入门到实践》day40
# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug: The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …...
IO多路复用学习笔记
参考资料: 视频1 视频2(本人B站也有发布) 视频3 参考笔记 参考博客...
Ubuntu设置中文输入法教程
在Ubuntu中设置中文输入法非常简单,只需按照以下步骤操作即可。 打开“设置”菜单。在Ubuntu的左上角点击“活动”按钮,然后在弹出的菜单中选择“设置”图标。 进入“区域和语言”设置。在设置菜单中,找到并点击“区域和语言”选项。 添加中…...
机器学习之爬山算法(Hill Climbing Algorithm)
爬山算法(Hill Climbing Algorithm)是一种简单而常见的启发式搜索算法,通常用于解决优化问题。它的基本思想类似于登山过程中爬升到山顶的过程,即从一个起始点开始,不断尝试向邻近的点移动,直到找到一个局部最优解。 下面是爬山算法的基本工作流程: 初始化:选择一个初…...

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139242199 贪心算法,是在每一步选择中,都采取当前状态下,最好或最优(即最有利)的选择&…...

Linux中ftp配置
一、ftp协议 1、端口 ftp默认使用20、21端口 20端口用于建立数据连接 21端口用于建立控制连接 2、ftp数据连接模式 主动模式:服务器主动发起数据连接 被动模式:服务器被动等待数据连接 二、ftp安装 yum install -y vsftpd #---下…...

BWVS 靶场测试
一、PHP弱类型 is_numeric() 输入:127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字,那么就输出num,同时如果num1,就输出flag。即num要是字符串又要是数字 # 2、函数分析: is_numeric()函数&…...

c++ 里重解释转换之于引用 reinterpret_cast< long >
今天遇到了这一很新奇的写法。模糊中记得王老师也这么讲过。c 里四大转换。把数据重解释为原来数据的引用。虽然也可以直接定义对变量的引用。测试如下: 咱们从反汇编再了解下 c 编译器是怎么处理这种写法的: 谢谢...

JAVASE2
封装的步骤: 1、所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问 2、对外提供简单入口:比如说被private修饰的成员变量,在其他类中只能通过getXxx/setXxx方法…...

ora-00392 ora-00312错误处理
检查当前日志组状态 对日志组进行clear操作 重新开库无报错...
网页、h5默认滚动条样式重构
文章目录 前言一、使用步骤1、在想要滚动的元素上设置相应的css类名2.设置样式 总结 前言 此文章用于,让我自己快速设置 浏览器、h5 默认滚动条样式…… 一、使用步骤 1、在想要滚动的元素上设置相应的css类名 代码如下: <div class"list scro…...

香橙派AIpro测评上手指南
一、前言 首先非常荣幸受到邀请参加本次香橙派开发板的测评活动,除了令人眼前一亮,做工非常精细的开发板,举办方还非常贴心地准备了散热套件,以及烧录好系统的TF卡,甚至准备了电源适配器,数据线࿱…...
GBDT 算法【python,机器学习,算法】
GBDT 即 Gradient Boosting Decision Tree 梯度提升树, 是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree), 它通过构造一组弱的学习器(树),然后把多棵决策树的结果累加起来作为最终的预测输出。该算法将决策…...

软考 系统架构设计师系列知识点之SOME/IP与DDS(3)
接前一篇文章:软考 系统架构设计师系列知识点之SOME/IP与DDS(2) 本文内容参考: 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#…...

将AI大模型装进你的手机,你愿意么?
大数据产业创新服务媒体 ——聚焦数据 改变商业 AI大模型的发展,有两个方向,一个是模型越做越大,以规模来提升性能。还有一个重要的方向,就是通过将模型做小,来嵌入手机、电脑等计算终端,这同样是值得关注…...
前端面试题12-22
12 Proxy是什么,有什么作用? Proxy 是 ES6 (ECMAScript 2015) 引入的一种元编程特性。它允许你创建一个对象,该对象可以拦截和定义基本操作(例如属性查找、赋值、枚举、函数调用等)。Proxy 提供了一种机制,…...
【论文解读】Performance of AV1 Real-Time Mode
论文下载地址:Performance of AV1 Real-Time Mode 时间:2020.10 级别:IEEE 作者:Ludovic Roux 摘要 背景:COVID-19疫情增加了对数字互动的需求,使得实时或低延迟编解码器变得更加重要。现状:大多数编解码器,包括AV1,主要关注于编码效率,这是视频点播(VOD)的主要改…...
java处理中文脱敏
方法一,简单的,不计算文字长度去设置脱敏 public static String dataDesensitization1(String content){String regex "(.{2}).*(.{2})";return ReUtil.replaceAll(content, regex, matcher -> {try {if (CharSequenceUtil.isBlank(match…...

【Linux网络】端口及UDP协议
文章目录 1.再看四层2.端口号2.1引入linux端口号和进程pid的区别端口号是如何生成的传输层有了pid还设置端口号端口号划分 2.2问题2.3netstat 3.UDP协议3.0每学一个协议 都要讨论一下问题3.1UDP协议3.2谈udp/tcp实际上是在讨论什么? 1.再看四层 2.端口号 端口号(Po…...

Unity 生成模版代码
1、创建模版代码文本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ClassNameScritpItem : MonoBehaviour {public GameObject go;// Start is called before the first frame updatevoid Start(){go new GameObject();}// …...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...