Django的請求和響應+template模板

🌟 如果這篇文章觸動了你的心弦,請不要吝嗇你的支持!

親愛的讀者,

感謝你花時間閱讀這篇分享。希望這里的每一個字都能為你帶來啟發或是讓你會心一笑。如果你覺得這篇文章有價值,或者它解決了你一直以來的一個疑問,請給個贊吧 —— 這不僅是對我學習效果的認可,更是激勵我繼續前行的動力!

而且,如果你不想錯過未來更多有趣的內容,記得點擊關注哦!這樣,每當有新文章發布時,你就能第一時間收到通知啦。讓我們一起在這個充滿無限可能的知識海洋中遨游,探索未知的世界吧!

最后,別忘了留下你的想法或問題在評論區。無論是贊美、建議還是疑問,我都非常期待聽到你的聲音。也許,正是你的那條評論,將開啟一段全新的討論旅程呢!

🌟 點贊、關注、留言 —— 三連走起,讓我們共同成長,一起變得更優秀!

再次感謝每一位可愛的你,愿你在追求夢想的路上一帆風順!



目錄

🌟 如果這篇文章觸動了你的心弦,請不要吝嗇你的支持!

接續上篇文章:???????《Django 實戰揭秘:從項目搭建到多頁面開發的超詳細指南》一_django 一個app創建多個頁面-CSDN博客

4.4.4template模版

4.4.5靜態文件

功能側重

應用場景

4.4.6模板語法

4.4.7 請求和響應

1. def something(request)

請求相關:

響應相關:

關于重定向的原理:

2. csrf_token

在表單中使用 csrf_token

AJAX 請求中的 CSRF 處理

視圖中處理 CSRF 驗證

豁免 CSRF 保護(不推薦在 POST 請求中使用)

CSRF 工作原理:

3.在Django中,如何使用請求和響應來實現文件上傳和下載?

一、文件上傳功能

二、文件下載功能

三、優化方案

四、配置 settings.py

五、關鍵知識點總結


4.4.4template模版

返回html的話需要將視圖py文件中的視圖函數→返回:

render(request,"user_list.html")

"user_list.html"在哪里尋找呢?

在templates目錄文件下的.html文件中找。更為詳細的說就是:在settings.py文件中注冊過的app,依照該注冊app的順序進行相應html文件的查找!

views.py文件:
from django.shortcuts import render,HttpResponse
def user_list(Request):return render(Request,"user_list.html")user_list.html:<h1>用戶列表</h1> 

效果圖:

注意:默認情況下只會在自己注冊的app中尋找相應的html文件。

如果在根目錄下有templates文件夾,那么肯定是配置了settings.py文件中的屬性:DIR[ 有內容]

如果里面有內容的話,那個尋找模版就是從根目錄開始尋找!

4.4.5靜態文件

注意:必須在app目錄下創建一個名為static的目錄下放置靜態資源(圖片等)

創建結構如圖所示:

步驟:

  1. 在app目錄下創建static文件夾:如上所示

  2. 在html模板中:

    1. 需要先引入:{% load static%}

    2. 代碼如下所示:

      {% load static %} ?  #關鍵點1
      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">  #關鍵點2:路徑
      </head>
      <body>
      <h1>用戶列表</h1>
      <input type="text" class="btn btn-primary" value="新建"/>
      <img src="{% static 'img/1.png' %}" alt="">
      <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
      <script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
      </body>
      </html>

      引入css和js:

      Download jQuery | jQuery

      Download · Bootstrap v5.3

      將下載好的文件放置于項目工程文件夾中。

      溫馨提示:Bootstrap中也有js文件夾,那么和jQuery有什么區別呢?

      Query 和 Bootstrap 中的 js 文件在功能上有以下區別:

      功能側重

      • jQuery

        :是 JavaScript 函數庫,重點在簡化 JavaScript 操作。

        • DOM 操作:提供強大選擇器,像$('id') $('class') $('tag')等,能便捷選取并操作 HTML 元素,比如增刪改查節點 、獲取或設置屬性值 。例如$('#elementId').text('新文本') 可修改指定id元素文本內容。

        • 事件處理:能輕松綁定事件,如clickmouseoversubmit等。$('button').click(function(){ /* 點擊按鈕執行代碼 */ }); 可實現按鈕點擊響應。

        • 動畫效果:方便創建元素動畫,像淡入淡出、滑動、漸隱漸現等。$('#box').fadeIn('slow'); 能讓指定元素緩慢淡入顯示。

        • Ajax 交互:簡化與服務器的數據交互,可異步獲取數據并更新頁面。$.ajax({ url: 'data.php', success: function(data){ /* 處理返回數據 */ } }); 能從服務器獲取數據。

      • Bootstrap 的 js 文件

        :屬于前端框架的一部分,基于 jQuery 開發(Bootstrap 5 開始不強制依賴 ),主要為組件賦予交互功能。

        • 組件交互:為按鈕、模態框、導航欄、標簽頁等組件提供交互行為。如點擊按鈕彈出模態框、切換標簽頁等。

        • 響應式行為:配合 CSS 實現響應式布局相關交互,如導航欄在不同屏幕尺寸下的折疊、展開等。

      應用場景

      • jQuery:適用于各類需要操作 DOM、處理事件、實現動畫或 Ajax 交互的場景,開發靈活,可根據需求編寫自定義功能。

      • Bootstrap 的 js 文件:用于快速構建響應式、具備統一風格的網站或應用,利用其現成組件快速搭建頁面交互,提升開發效率。

      最后經過更新后的代碼:

      {% load static %} ? 
      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap5.3/css/bootstrap.css' %}">
      </head>
      <body>
      <h1>用戶列表</h1>
      <input type="text" class="btn btn-primary" value="新建"/>
      <img src="{% static 'img/1.jpg' %}" alt="">
      <script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
      <script src="{% static 'plugins/bootstrap5.3/js/bootstrap.js' %}"></script>
      </body>
      </html>

      結果如下所示:

4.4.6模板語法

本質上:就是占位符

首先創建了一個HTML文件:user_lh.html文件

{% load static %} ? 
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
<h1>模版語法</h1>
<div>{{hkc}}</div>
<div>{{roles}}</div>
<div>{{roles.0}}</div>
<div>{{roles.1}}</div>
<div>{{roles.2}}</div>
?
</body>
</html>

然后創建對應的視圖函數:

def user_lh(Request):name="行手動閥"roles=["老板","員工","領導"]return render (Request,"user_lh.html",{"hkc":name,"roles":roles})

實現效果:

4.4.7 請求和響應
1. def something(request)

request 是一個封裝了用戶所有請求數據的對象,以下是其常用屬性和方法的示例:

請求相關:

request.method (獲取請求方式)

def handle_request(request):if request.method == 'GET':return HttpResponse('這是GET請求')elif request.method == 'POST':return HttpResponse('這是POST請求')else:return HttpResponse(f'不支持的請求方式: {request.method}')

request.GET (通過 URL 傳遞參數)

# URL示例: /search/?keyword=python&page=2
def search(request):keyword = request.GET.get('keyword', '') ?# 獲取參數,默認值為空字符串page = request.GET.get('page', 1) ? ? ? ?# 獲取參數,默認值為1return HttpResponse(f'搜索關鍵詞: {keyword}, 頁碼: {page}')

request.POST (在請求體中提交數據)

# 處理表單提交
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == 'admin' and password == '123456':return HttpResponse('登錄成功')else:return HttpResponse('用戶名或密碼錯誤')# GET請求返回登錄表單return render(request, 'login.html')
響應相關:

內容字符串返回瀏覽器 (return HttpResponse)

def hello(request):return HttpResponse('Hello, World!')

讀取 HTML 內容并渲染 (return render)

def home(request):context = {'title': '首頁','welcome': '歡迎訪問我的網站'}return render(request, 'home.html', context)

返回網址跳轉 (redirect)

from django.shortcuts import redirect
?
def old_url(request):# 重定向到新的URLreturn redirect('/new-url/') ?# 瀏覽器會收到302狀態碼并自動跳轉
?
def permanent_redirect(request):# 永久重定向(301)return redirect('/permanent-new-url/', permanent=True)
?
def redirect_with_params(request):# 帶參數的重定向return redirect('user_profile', user_id=123) ?# 假設使用了命名URL
關于重定向的原理:
  • Django 的redirect函數會返回一個 HttpResponseRedirect 對象(狀態碼 302/301)

  • 瀏覽器收到這個響應后,會自動發送新的請求到指定的 URL

  • 302 表示臨時重定向,搜索引擎不會更新索引

  • 301 表示永久重定向,搜索引擎會更新索引

2. csrf_token

CSRF(跨站請求偽造)保護是 Django 提供的安全機制,用于防止惡意網站偽裝成合法請求。

示例:

在表單中使用 csrf_token
<!-- login.html -->
<form method="post">{% csrf_token %}<label for="username">用戶名:</label><input type="text" id="username" name="username"><br><label for="password">密碼:</label><input type="password" id="password" name="password"><br><button type="submit">登錄</button>
</form>
AJAX 請求中的 CSRF 處理
<!-- 模板中添加CSRF令牌 -->
<script>function getCookie(name) {let cookieValue = null;if (document.cookie && document.cookie !== '') {const cookies = document.cookie.split(';');for (let i = 0; i < cookies.length; i++) {const cookie = cookies[i].trim();if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;}// 獲取CSRF令牌const csrftoken = getCookie('csrftoken');// 發送AJAX請求時添加CSRF頭function sendAjaxRequest() {fetch('/api/submit/', {method: 'POST',headers: {'Content-Type': 'application/json','X-CSRFToken': csrftoken},body: JSON.stringify({data: 'example'})}).then(response => response.json()).then(data => console.log(data));}
</script>
視圖中處理 CSRF 驗證
from django.views.decorators.csrf import csrf_protect
?
@csrf_protect ?# 顯式啟用CSRF保護
def process_form(request):if request.method == 'POST':# 處理表單數據return HttpResponse('表單提交成功')else:return render(request, 'form.html')
豁免 CSRF 保護(不推薦在 POST 請求中使用)
from django.views.decorators.csrf import csrf_exempt
?
@csrf_exempt ?# 禁用CSRF保護
def api_endpoint(request):if request.method == 'POST':# 處理API請求return JsonResponse({'status': 'success'})else:return JsonResponse({'error': 'Method not allowed'}, status=405)
CSRF 工作原理:
  1. Django 在渲染模板時,會在<form>標簽中插入一個隱藏的csrfmiddlewaretoken字段

  2. 當表單提交時,這個 token 會隨請求一起發送到服務器

  3. Django 中間件會驗證請求中的 token 與用戶會話中的 token 是否一致

  4. 對于 AJAX 請求,需要從 cookie 中獲取 CSRF 令牌并添加到請求頭中(X-CSRFToken

3.在Django中,如何使用請求和響應來實現文件上傳和下載?

在 Django 中實現文件上傳和下載功能需要結合請求處理和響應返回,下面是詳細的實現方法:

一、文件上傳功能
  1. 創建表單模板 (upload_form.html)

<form method="POST" enctype="multipart/form-data">{% csrf_token %}<input type="file" name="myfile"><button type="submit">上傳文件</button>
</form>
  1. 視圖函數處理上傳 (views.py)

from django.shortcuts import render
from django.http import HttpResponse
?
def upload_file(request):if request.method == 'POST' and request.FILES.get('myfile'):# 獲取上傳的文件對象uploaded_file = request.FILES['myfile']# 保存文件到服務器with open(f'media/{uploaded_file.name}', 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return HttpResponse('文件上傳成功!')return render(request, 'upload_form.html')
  1. 關鍵要點:

  • 表單設置:必須使用 method="POST"enctype="multipart/form-data"

  • 文件對象:通過 request.FILES['字段名'] 獲取上傳的文件

  • 文件保存:推薦使用 chunks() 方法分塊寫入,避免大文件內存溢出

二、文件下載功能
  1. 視圖函數返回文件 (views.py)

from django.http import FileResponse, HttpResponseNotFound
import os
?
def download_file(request):file_path = 'media/example.pdf' ?# 文件在服務器上的路徑if os.path.exists(file_path):# 打開文件并返回響應response = FileResponse(open(file_path, 'rb'))response['Content-Type'] = 'application/octet-stream' ?# 二進制流response['Content-Disposition'] = 'attachment; filename="example.pdf"'return responseelse:return HttpResponseNotFound('文件不存在!')
  1. 動態文件名下載

def dynamic_download(request):filename = request.GET.get('filename')file_path = f'media/{filename}'if os.path.exists(file_path):response = FileResponse(open(file_path, 'rb'))response['Content-Disposition'] = f'attachment; filename="{filename}"'return responsereturn HttpResponseNotFound('文件不存在!')
  1. 關鍵要點:

  • 響應類型:使用 FileResponseHttpResponse 返回文件內容

  • Content-Type

    :常見值包括:

    • application/octet-stream(通用二進制文件)

    • application/pdf(PDF 文件)

    • image/jpeg(JPEG 圖片)

  • Content-Dispositionattachment 強制下載,filename 指定下載后的文件名

三、優化方案
  1. 使用 Django 的 FileSystemStorage

from django.core.files.storage import FileSystemStorage
?
def upload_file(request):if request.method == 'POST' and request.FILES.get('myfile'):myfile = request.FILES['myfile']fs = FileSystemStorage()filename = fs.save(myfile.name, myfile) ?# 自動處理重名文件file_url = fs.url(filename)return HttpResponse(f'文件已上傳: <a href="{file_url}">{filename}</a>')return render(request, 'upload_form.html')
  1. 安全下載(避免路徑遍歷攻擊)

from django.conf import settings
from django.utils.encoding import smart_str
?
def secure_download(request):filename = request.GET.get('filename')valid_files = {'example.pdf', 'data.csv'} ?# 允許下載的文件白名單if filename in valid_files:file_path = os.path.join(settings.MEDIA_ROOT, filename)response = FileResponse(open(file_path, 'rb'))response['Content-Disposition'] = f'attachment; filename="{smart_str(filename)}"'return responsereturn HttpResponseForbidden('禁止訪問該文件!')
  1. 大文件流式下載

def stream_download(request):file_path = 'media/large_file.zip'try:response = FileResponse(open(file_path, 'rb'), as_attachment=True)response['Content-Disposition'] = 'attachment; filename="large_file.zip"'return responseexcept Exception:return HttpResponseServerError('下載失敗,請稍后再試!')
四、配置 settings.py
# settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
?
# urls.py
from django.conf import settings
from django.conf.urls.static import static
?
urlpatterns = [# 其他URL配置...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
五、關鍵知識點總結
  1. 文件上傳

    • 表單需設置 enctype="multipart/form-data"

    • 通過 request.FILES 獲取文件對象

    • 使用 FileSystemStorage 簡化文件管理

  2. 文件下載

    • 使用 FileResponse 返回二進制文件

    • 設置 Content-Disposition 控制下載行為

    • 對用戶提供的文件名進行嚴格驗證,防止路徑遍歷攻擊

  3. 安全注意事項

    • 限制上傳文件大小(通過 FILE_UPLOAD_MAX_MEMORY_SIZE

    • 驗證上傳文件類型(擴展名、MIME 類型)

    • 避免直接暴露服務器文件路徑

通過以上方法,你可以在 Django 中安全、高效地實現文件上傳和下載功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python |GIF 解析與構建(2):狀態機解析

Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 目錄 Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 引言 一、狀態機概述 狀態機的優勢與改進方向 總結 引言 在《Python &#xff5c;GIF 解…

PCB設計實踐(二十六)貼片電容與插件電容的全面解析:差異、演進與應用場景

一、核心差異&#xff1a;結構與性能對比 物理結構與封裝形式 貼片電容&#xff08;Surface Mount Device, SMD&#xff09;采用扁平化設計&#xff0c;外形多為長方體或圓柱體&#xff0c;直接通過焊盤固定在電路板表面。其封裝材料通常為陶瓷、聚合物或鋁電解層&#xff0c;外…

XC7A200T-2FFG1156I FPGA AMD Xilinx Artix-7

XC7A200T-2FFG1156I 是 AMD Xilinx Artix-7 系列的一款高性能低功耗 FPGA&#xff0c;采用 28 nm 高性能低功耗&#xff08;HPL&#xff09;工藝制造&#xff0c;核心電壓在 0.95 V–1.05 V 之間&#xff0c;可在 –40 C 至 100 C 工業溫度范圍內穩定工作 。 邏輯資源&#xff…

LVS + Keepalived + Nginx 高可用負載均衡系統實驗

1. 項目背景 在現代 Web 應用中&#xff0c;高可用性和負載均衡是至關重要的需求。本項目旨在通過 LVS&#xff08;Linux Virtual Server&#xff09;實現流量分發&#xff0c;通過 Keepalived 實現高可用性&#xff0c;通過 Nginx 提供后端服務。該架構能夠確保在單點故障的情…

window 顯示驅動開發-視頻內存供應和回收(一)

Windows 顯示驅動程序模型 (WDDM) 1.2 及更高版本用戶模式顯示驅動程序必須使用內存套餐和回收功能&#xff08;從Windows 8開始提供&#xff09;&#xff0c;以減少本地內存和系統內存中臨時表面所需的內存開銷。 最低 WDDM 版本&#xff1a;1.2 最低 Windows 版本&#xff…

什么是VR場景?VR與3D漫游到底有什么區別

在數字化時代&#xff0c;虛擬現實&#xff08;Virtual Reality, 簡稱VR&#xff09;場景與3D漫游作為兩種前沿技術&#xff0c;改變著人們的生活方式和體驗模式。通過計算機模擬真實或假想的場景&#xff0c;讓用戶仿佛身臨其境&#xff0c;并能與虛擬環境進行互動。盡管VR場景…

JAVA查漏補缺(2)

AJAX 什么是Ajax Ajax&#xff08;Asynchronous Javascript And XML&#xff09;&#xff0c;即是異步的JavaScript和XML&#xff0c;Ajax其實就是瀏覽器與服務器之間的一種異步通信方式 異步的JavaScript 它可以異步地向服務器發送請求&#xff0c;在等待響應的過程中&…

客服中心大模型應用演進路線:從傳統服務到超級智能助手的轉型

客服中心作為企業與客戶溝通的重要橋梁&#xff0c;近年來經歷了從人工服務到人工智能驅動的深刻變革。本文基于"客服中心大模型應用演進路線圖"&#xff0c;詳細解析客服中心從傳統模式向AI驅動智能服務的轉型歷程&#xff0c;剖析每個發展階段的特點、應用場景及關…

使用 OpenCV 實現“隨機鏡面墻”——多鏡片密鋪的哈哈鏡效果

1. 引言 “哈哈鏡”是一種典型的圖像變形效果&#xff0c;通過局部鏡面反射產生扭曲的視覺趣味。在計算機視覺和圖像處理領域&#xff0c;這類效果不僅有趣&#xff0c;還能用于藝術創作、交互裝置、視覺特效等場景。 傳統的“哈哈鏡”往往是針對整張圖像做某種鏡像或扭曲變換…

Python訓練營打卡——DAY33(2025.5.22)

目錄 簡單的神經網絡 一、PyTorch的安裝 二、準備工作 三、數據的準備 四、模型架構定義 五、模型訓練&#xff08;CPU版本&#xff09; 1. 定義損失函數和優化器 2. 開始循環訓練 3. 可視化結果 六、通俗解釋 1. 環境安裝&#xff08;相當于買鍋碗瓢盆&#xff09;…

目標檢測 Lite-DETR(2023)詳細解讀

文章目錄 迭代高級特征跨尺度融合高效的低層次特征跨尺度融合KDA&#xff1a;Key-aware Deformable Attention 論文翻譯&#xff1a; CVPR 2023 | Lite DETR&#xff1a;計算量減少60%&#xff01;高效交錯多尺度編碼器-CSDN博客 DINO團隊的 &#xff08;Lightweight Transfo…

ES(Elasticsearch) 基本概念(一)

Elasticsearch作為當前最流行的開源搜索和分析引擎&#xff0c;廣泛應用于日志分析、全文搜索、業務智能等領域。Elasticsearch是一個基于 Apache Lucene 構建的分布式搜索和分析引擎、可擴展數據存儲和矢量數據庫。它針對生產級工作負載的速度和相關性進行了優化。使用 Elasti…

當物聯網“芯”闖入納米世界:ESP32-S3驅動的原子力顯微鏡能走多遠?

上次咱們把OV2640攝像頭“盤”得明明白白&#xff0c;是不是感覺ESP32-S3這小東西潛力無限&#xff1f;今天&#xff0c;咱們玩個更刺激的&#xff0c;一個聽起來就讓人腎上腺素飆升的挑戰——嘗試用ESP32-S3這顆“智慧芯”&#xff0c;去捅一捅科學界的“馬蜂窩”&#xff0c;…

Excel合并單元格后,如何自動批量生成序號列

1.選擇整列 2.組合鍵&#xff1a;CtrlG 3.定位條件&#xff0c;選擇“空值” 4.在第一個框中輸入“MAX(”&#xff0c;鼠標選中A1框&#xff0c;后加“&#xff1a;”&#xff0c;鼠標選中前方“A1”&#xff0c;按“F4”絕對引用&#xff0c;補全右括號&#xff0c;后輸入“1…

TDengine 運維—容量規劃

概述 若計劃使用 TDengine 搭建一個時序數據平臺&#xff0c;須提前對計算資源、存儲資源和網絡資源進行詳細規劃&#xff0c;以確保滿足業務場景的需求。通常 TDengine 會運行多個進程&#xff0c;包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在這些進程…

Axure設計數字鄉村可視化大屏:從布局到交互的實戰經驗分享

鄉村治理正從傳統模式向“數據驅動”轉型。數字鄉村可視化大屏作為數據展示的核心載體&#xff0c;不僅能直觀呈現鄉村發展全貌&#xff0c;還能為決策提供科學依據。本文以Axure為工具&#xff0c;結合實際案例&#xff0c;分享如何從零設計一個功能完備、交互流暢的數字鄉村大…

從零基礎到最佳實踐:Vue.js 系列(1/10):《環境搭建與基礎概念》

Vue.js 環境搭建與基礎概念 關鍵點 Vue.js 是一個簡單易用的前端框架&#xff0c;適合初學者快速上手。搭建開發環境需要安裝 Node.js 和 npm/Yarn&#xff0c;推薦使用最新 LTS 版本。Vue CLI 是官方工具&#xff0c;可快速創建項目并提供開發服務器。Vue.js 基于 MVVM 模式&…

使用docker compose部署dify(大模型開發使用平臺)

Dify是一款生成式 AI 應用中間件&#xff0c;面向有私有部署與數據合規需求的企業用戶&#xff0c;推動企業向 AI 時代轉型。平臺支持無代碼構建&#xff0c;業務人員即可快速搭建與調試 AI 應用&#xff0c;顯著降低開發門檻。 參考 https://docs.dify.ai/zh-hans/getting-s…

npm 安裝時 SSL 證書過期問題筆記

問題描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 這表明當前配置的 npm 鏡像源&#xff08;淘寶鏡像 https://registry.npm.taobao.org&…

力扣HOT100之二叉樹: 236. 二叉樹的最近公共祖先

果然&#xff0c;這道題二刷還是不會做&#xff0c;回去看卡爾視頻了。結合靈神的題解&#xff0c;我對這道題有了一些新的理解。 首先這道題還是用遞歸來做&#xff0c;由于我們需要計算兩個節點的最近公共祖先&#xff0c;一定是從下往上來遍歷&#xff0c;只有先判斷左右子樹…