Django——認證系統(Day72)

閱讀目錄

  COOKIE 與 SESSION

  用戶認證

?

COOKIE 與 SESSION

概念

cookie不屬于http協議范圍,由于http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。

cookie的工作原理是:由服務器產生內容,瀏覽器收到請求后保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。

cookie雖然在一定程度上解決了“保持狀態”的需求,但是由于cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,并且他保存在服務器,有較高的安全性。這就是session。

問題來了,基于http協議的無狀態特征,服務器根本就不知道訪問者是“誰”。那么上述的cookie就起到橋接的作用。

我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然后我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。

總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session里保存私密的信息以及超過4096字節的文本。

另外,上述所說的cookie和session其實是共通性的東西,不限于語言和框架

登陸應用

前幾節的介紹中我們已經有能力制作一個登陸頁面,在驗證了用戶名和密碼的正確性后跳轉到后臺的頁面。但是測試后也發現,如果繞過登陸頁面。直接輸入后臺的url地址也可以直接訪問的。這個顯然是不合理的。其實我們缺失的就是cookie和session配合的驗證。有了這個驗證過程,我們就可以實現和其他網站一樣必須登錄才能進入后臺頁面了。

? ? ? 先說一下這種認證的機制。每當我們使用一款瀏覽器訪問一個登陸頁面的時候,一旦我們通過了認證。服務器端就會發送一組隨機唯一的字符串(假設是123abc)到瀏覽器端,這個被存儲在瀏覽端的東西就叫cookie。而服務器端也會自己存儲一下用戶當前的狀態,比如login=true,username=hahaha之類的用戶信息。但是這種存儲是以字典形式存儲的,字典的唯一key就是剛才發給用戶的唯一的cookie值。那么如果在服務器端查看session信息的話,理論上就會看到如下樣子的字典

{'123abc':{'login':true,'username:hahaha'}}

因為每個cookie都是唯一的,所以我們在電腦上換個瀏覽器再登陸同一個網站也需要再次驗證。那么為什么說我們只是理論上看到這樣子的字典呢?因為處于安全性的考慮,其實對于上面那個大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服務器端也是一樣被加密的。所以我們服務器上就算打開session信息看到的也是類似與以下樣子的東西

{'123abc':dasdasdasd1231231da1231231}

知道了原理,下面就來用代碼實現。

Django實現的COOKIE

1、獲取Cookie

1
2
3
4
5
6
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
????#參數:
????????default: 默認值
???????????salt: 加密鹽
????????max_age: 后臺控制過期時間

2、設置Cookie

1
2
3
4
rep?=?HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...) 

?參數:

復制代碼
'''def set_cookie(self, key,                 鍵value='',            值max_age=None,        超長時間expires=None,        超長時間path='/',           Cookie生效的路徑,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將cookie傳給站點中的其他的應用。/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問domain=None,         Cookie生效的域名你可用這個參數來構造一個跨站cookie。如, domain=".example.com"所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 
                         和an.other.sub.domain.example.com 。如果該參數設置為 None ,cookie只能由設置它的站點讀取。secure=False, 如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)): pass'''
復制代碼

由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。

1
2
3
<script src='/static/js/jquery.cookie.js'>
</script> $.cookie("key", value,{ path:?'/'?});

3 刪除cookie

1
response.delete_cookie("cookie_key",path="/",domain=name)

?cookie存儲到客戶端
? ? ? ?優點:
? ? ? ? ? ?數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。
? ? ? ?缺點:
? ? ? ? ? ?安全性不高:在客戶端機很容易被查看或破解用戶會話信息

Django實現的SESSION

1、 基本操作

1
2
3
4
5
6
7
8
1、設置Sessions值
??????????request.session['session_name']?="admin"
2、獲取Sessions值
??????????session_name?=?request.session["session_name"]
3、刪除Sessions值
??????????del?request.session["session_name"]
4、檢測是否操作session值
??????????if?"session_name"?is?request.session :

2、 流程解析圖

?3、 示例

views:

def log_in(request):if request.method=="POST":username=request.POST['user']password=request.POST['pwd']user=UserInfo.objects.filter(username=username,password=password)if user:#設置session內部的字典內容request.session['is_login']='true'request.session['username']=username#登錄成功就將url重定向到后臺的urlreturn redirect('/backend/')#登錄不成功或第一訪問就停留在登錄頁面return render(request,'login.html')def backend(request):print(request.session,"------cookie")print(request.COOKIES,'-------session')"""這里必須用讀取字典的get()方法把is_login的value缺省設置為False,當用戶訪問backend這個url先嘗試獲取這個瀏覽器對應的session中的is_login的值。如果對方登錄成功的話,在login里就已經把is_login的值修改為了True,反之這個值就是False的"""is_login=request.session.get('is_login',False)#如果為真,就說明用戶是正常登陸的if is_login:#獲取字典的內容并傳入頁面文件cookie_content=request.COOKIESsession_content=request.sessionusername=request.session['username']return render(request,'backend.html',locals())else:"""如果訪問的時候沒有攜帶正確的session,就直接被重定向url回login頁面"""return redirect('/login/')def log_out(request):"""直接通過request.session['is_login']回去返回的時候,如果is_login對應的value值不存在會導致程序異常。所以需要做異常處理"""try:#刪除is_login對應的value值del request.session['is_login']# OR---->request.session.flush() # 刪除django-session表中的對應一行記錄except KeyError:pass#點擊注銷之后,直接重定向回登錄頁面return redirect('/login/')

template:

===================================login.html==================
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/login/" method="post"><p>用戶名: <input type="text" name="user"></p><p>密碼: <input type="password" name="pwd"></p><p><input type="submit"></p>
</form></body>
</html>===================================backend.html==================<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>hello {{ username }}</h3>
<a href="/logout/">注銷</a></body>
</html>

4、session存儲的相關配置

(1)數據庫配置(默認):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Django默認支持Session,并且默認是將Session數據存儲在數據庫中,即:django_session 表中。
??
a. 配置 settings.py
??
????SESSION_ENGINE?=?'django.contrib.sessions.backends.db'???# 引擎(默認)
??????
????SESSION_COOKIE_NAME =?"sessionid"???????????????????????# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
????SESSION_COOKIE_PATH =?"/"???????????????????????????????# Session的cookie保存的路徑(默認)
????SESSION_COOKIE_DOMAIN?=?None?????????????????????????????# Session的cookie保存的域名(默認)
????SESSION_COOKIE_SECURE?=?False????????????????????????????# 是否Https傳輸cookie(默認)
????SESSION_COOKIE_HTTPONLY?=?True???????????????????????????# 是否Session的cookie只支持http傳輸(默認)
????SESSION_COOKIE_AGE?=?1209600?????????????????????????????# Session的cookie失效日期(2周)(默認)
????SESSION_EXPIRE_AT_BROWSER_CLOSE?=?False??????????????????# 是否關閉瀏覽器使得Session過期(默認)
????SESSION_SAVE_EVERY_REQUEST?=?False???????????????????????# 是否每次請求都保存Session,默認修改之后才保存(默認)

(2)緩存配置 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a. 配置 settings.py
??
????SESSION_ENGINE?=?'django.contrib.sessions.backends.cache'??# 引擎
????SESSION_CACHE_ALIAS?=?'default'????????????????????????????# 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
??
??
????SESSION_COOKIE_NAME =?"sessionid"????????????????????????# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
????SESSION_COOKIE_PATH =?"/"????????????????????????????????# Session的cookie保存的路徑
????SESSION_COOKIE_DOMAIN?=?None??????????????????????????????# Session的cookie保存的域名
????SESSION_COOKIE_SECURE?=?False?????????????????????????????# 是否Https傳輸cookie
????SESSION_COOKIE_HTTPONLY?=?True????????????????????????????# 是否Session的cookie只支持http傳輸
????SESSION_COOKIE_AGE?=?1209600??????????????????????????????# Session的cookie失效日期(2周)
????SESSION_EXPIRE_AT_BROWSER_CLOSE?=?False???????????????????# 是否關閉瀏覽器使得Session過期
????SESSION_SAVE_EVERY_REQUEST?=?False????????????????????????# 是否每次請求都保存Session,默認修改之后才保存

(3)文件配置

1
2
3
4
5
6
7
8
9
10
11
12
a. 配置 settings.py
??
????SESSION_ENGINE?=?'django.contrib.sessions.backends.file'????# 引擎
????SESSION_FILE_PATH?=?None????????????????????????????????????# 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()????????
????SESSION_COOKIE_NAME =?"sessionid"??????????????????????????# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
????SESSION_COOKIE_PATH =?"/"??????????????????????????????????# Session的cookie保存的路徑
????SESSION_COOKIE_DOMAIN?=?None????????????????????????????????# Session的cookie保存的域名
????SESSION_COOKIE_SECURE?=?False???????????????????????????????# 是否Https傳輸cookie
????SESSION_COOKIE_HTTPONLY?=?True??????????????????????????????# 是否Session的cookie只支持http傳輸
????SESSION_COOKIE_AGE?=?1209600????????????????????????????????# Session的cookie失效日期(2周)
????SESSION_EXPIRE_AT_BROWSER_CLOSE?=?False?????????????????????# 是否關閉瀏覽器使得Session過期
????SESSION_SAVE_EVERY_REQUEST?=?False??????????????????????????# 是否每次請求都保存Session,默認修改之后才保存

?

用戶認證 

auth模塊

1
from?django.contrib?import?auth

django.contrib.auth中提供了許多方法,這里主要介紹其中的三個:

1 、authenticate()???

提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要username? password兩個關鍵字參數

如果認證信息有效,會返回一個? User? 對象。authenticate()會在User 對象上設置一個屬性標識那種認證后端認證了該用戶,且該信息在后面的登錄過程中是需要的。當我們試圖登陸一個從數據庫中直接取出來不經過authenticate()的User對象會報錯的!!

1
user?=?authenticate(username='someone',password='somepassword')

2 、login(HttpRequest, user)  

該函數接受一個HttpRequest對象,以及一個認證了的User對象

此函數使用django的session框架給某個已認證的用戶附加上session id等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
from?django.contrib.auth?import?authenticate, login
???
def?my_view(request):
??username?=?request.POST['username']
??password?=?request.POST['password']
??user?=?authenticate(username=username, password=password)
??if?user?is?not?None:
????login(request, user)
????# Redirect to a success page.
????...
??else:
????# Return an 'invalid login' error message.
????...

3 、logout(request) 注銷用戶  

1
2
3
4
5
from?django.contrib.auth?import?logout
???
def?logout_view(request):
??logout(request)
??# Redirect to a success page.

該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。

4 、user對象的?is_authenticated()

要求:

1? 用戶登陸后才能訪問某些頁面,

2? 如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面

3? 用戶在跳轉的登陸界面中完成登陸后,自動訪問跳轉到之前訪問的地址

方法1:

1
2
3
def?my_view(request):
??if?not?request.user.is_authenticated():
????return?redirect('%s?next=%s'?%?(settings.LOGIN_URL, request.path))

方法2:

django已經為我們設計好了一個用于此種情況的裝飾器:login_requierd()

1
2
3
4
5
from?django.contrib.auth.decorators?import?login_required
??????
@login_required
def?my_view(request):
??...

若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ ' (這個值可以在settings文件中通過LOGIN_URL進行修改)。并傳遞? 當前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。

User對象

User 對象屬性:username, password(必填項)password用哈希算法保存到數據庫

is_staff : 用戶是否擁有網站的管理權限.

is_active : 是否允許用戶登錄, 設置為``False``,可以不用刪除用戶來禁止 用戶登錄

?

2.1 、is_authenticated()

如果是真正的 User 對象,返回值恒為 True 。 用于檢查用戶是否已經通過了認證。
通過認證并不意味著用戶擁有任何權限,甚至也不檢查該用戶是否處于激活狀態,這只是表明用戶成功的通過了認證。 這個方法很重要, 在后臺用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前臺展示request.user.name

2.2 、創建用戶

使用 create_user 輔助函數創建用戶:

1
2
from?django.contrib.auth.models?import?User
user?=?User.objects.create_user(username='',password='',email='')

2.3 、check_password(passwd)

1
用戶需要修改密碼的時候 首先要讓他輸入原來的密碼 ,如果給定的字符串通過了密碼檢查,返回?True

2.4 、修改密碼

使用 set_password() 來修改密碼

1
2
3
user?=?User.objects.get(username='')
user.set_password(password='')
user.save 

2.5 、簡單示例

注冊:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def?sign_up(request):
????state?=?None
????if?request.method?==?'POST':
????????password?=?request.POST.get('password', '')
????????repeat_password?=?request.POST.get('repeat_password', '')
????????email=request.POST.get('email', '')
????????username?=?request.POST.get('username', '')
????????if?User.objects.filter(username=username):
????????????????state?=?'user_exist'
????????else:
????????????????new_user?=?User.objects.create_user(username=username, password=password,email=email)
????????????????new_user.save()
????????????????return?redirect('/book/')
????content?=?{
????????'state': state,
????????'user':?None,
????}
????return?render(request,?'sign_up.html', content)  

修改密碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@login_required
def?set_password(request):
????user?=?request.user
????state?=?None
????if?request.method?==?'POST':
????????old_password?=?request.POST.get('old_password', '')
????????new_password?=?request.POST.get('new_password', '')
????????repeat_password?=?request.POST.get('repeat_password', '')
????????if?user.check_password(old_password):
????????????if?not?new_password:
????????????????state?=?'empty'
????????????elif?new_password !=?repeat_password:
????????????????state?=?'repeat_error'
????????????else:
????????????????user.set_password(new_password)
????????????????user.save()
????????????????return?redirect("/log_in/")
????????else:
????????????state?=?'password_error'
????content?=?{
????????'user': user,
????????'state': state,
????}
????return?render(request,?'set_password.html', content)

轉載于:https://www.cnblogs.com/shaojiafeng/p/7761572.html

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

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

相關文章

description方法

1.description基本概念 NSLog("%", objectA);這會自動調用objectA的description方法來輸出ObjectA的描述信息. description方法默認返回對象的描述信息(默認實現是返回類名和對象的內存地址) description方法是基類NSObject 所帶的方法,因為其默認實現是返回類名和…

leetcode面試題 10.05. 稀疏數組搜索(二分法)

稀疏數組搜索。有個排好序的字符串數組&#xff0c;其中散布著一些空字符串&#xff0c;編寫一種方法&#xff0c;找出給定字符串的位置。 示例1: 輸入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “ta” 輸出…

laravel框架制作縮略圖和水印

1.首先需要使用 composer 在命令行安裝最新版本的 intervention/image &#xff1a; composer require intervention/image2.注冊服務提供者及別名&#xff08;Laravel 版本 ≤ 5.4&#xff09; 如果你的 laravel 版本小于或等于 5.4&#xff0c;安裝后需要注冊服務提供者和別…

mysql 模糊查詢 tp框架_TP框架中模糊查詢實現

TP框架中模糊查詢實現$where[g.name] array(like,%.$groupname.%);表達式查詢上面的查詢條件僅僅是一個簡單的相等判斷&#xff0c;可以使用查詢表達式支持更多的SQL查詢語法&#xff0c;查詢表達式的使用格式&#xff1a;$map[字段1] array(表達式,查詢條件1);$map[字段2] ar…

肉體之愛的解釋圣經_可以解釋的AI簡介,以及我們為什么需要它

肉體之愛的解釋圣經by Patrick Ferris帕特里克費里斯(Patrick Ferris) 可以解釋的AI簡介&#xff0c;以及我們為什么需要它 (An introduction to explainable AI, and why we need it) Neural networks (and all of their subtypes) are increasingly being used to build pro…

Python可變與不可變類型及垃圾回收機制

1. 可變與不可變類型 1.1 可變類型 在id不變的情況下&#xff0c;value可以改變&#xff0c;則稱之為可變類型。列表、字典與集合是可變的。 l1 [1,2,3,4,5] print(id(l1)) l1[1] 520 #改變列表元素 print(id(l1)) result&#xff1a; 1700748379208 …

12-1 12 防盜鏈 訪問控制 php解析 代理

2019獨角獸企業重金招聘Python工程師標準>>> 12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配置 12.16 Nginx代理 擴展 502問題匯總 http://ask.apelearn.com/question/9109location優先級 http://blog.lishiming.net/?p10012.13 Nginx防盜鏈 用來…

leetcode911. 在線選舉(二分法)

在選舉中&#xff0c;第 i 張票是在時間為 times[i] 時投給 persons[i] 的。 現在&#xff0c;我們想要實現下面的查詢函數&#xff1a; TopVotedCandidate.q(int t) 將返回在 t 時刻主導選舉的候選人的編號。 在 t 時刻投出的選票也將被計入我們的查詢之中。在平局的情況下&…

1-13句子逆序

題目描述 將一個英文語句以單詞為單位逆序排放。例如“I am a boy”&#xff0c;逆序排放后為“boy a am I”所有單詞之間用一個空格隔開&#xff0c;語句中除了英文字母外&#xff0c;不再包含其他字符 接口說明 /** * 反轉句子 * * param sentence 原句子 * return 反轉后的…

單例模式實現DB類

創建一個類 class DB_class {//public $name andy;//私有的屬性private static $db;//公共的靜態方法public static function index(){if (self::$db ! null ){return self::$db;}self::$dbnew DB_class();return self::$db;}//私有的構造方法private function __construct()…

終端定時任務 開始緩沖_如何開始使用終端以提高生產力

終端定時任務 開始緩沖by Luciano Strika通過盧西亞諾斯特里卡(Luciano Strika) 如何開始使用終端以提高生產力 (How to start using the terminal to be more productive) As developers, the terminal can be our second home.作為開發人員&#xff0c;碼頭可以成為我們的第…

圖片預覽------photoswipe 使用

photoswipe 使用 預覽圖片后&#xff0c;需要點擊關閉按鈕才能關閉&#xff0c;點擊圖片事件效果是放大圖片&#xff0c;和微信的效果不一致&#xff0c;最后改用微信預覽圖片的接口了&#xff0c;但是例子可以用&#xff0c;記錄一下&#xff01;&#xff01; http://www.cnbl…

SSKeychain

Keychain 使用? ---為了實用最大化我覺得我應該直接先說使用&#xff01; 當然是使用第三方庫啦&#xff1a;sskeychain 3000星星的庫不開玩笑。github地址&#xff1a;https://github.com/soffes/sskeychain 導入完之后首先&#xff0c;編譯一下有無錯。 如果是自己手動導入&…

shell高級-----正則表達式

正則表達式概述 正則表達式是一種定義的規則&#xff0c;Linux工具可以用它來過濾文本。 基礎正則表達式 純文本 [rootnode1 ~]# echo "this is a cat" | sed -n /cat/p this is a cat [rootnode1 ~]# echo "this is a cat" | gawk /cat/{print $0} this …

leetcode130. 被圍繞的區域(bfs)

給定一個二維的矩陣&#xff0c;包含 ‘X’ 和 ‘O’&#xff08;字母 O&#xff09;。 找到所有被 ‘X’ 圍繞的區域&#xff0c;并將這些區域里所有的 ‘O’ 用 ‘X’ 填充。 示例: X X X X X O O X X X O X X O X X 運行你的函數后&#xff0c;矩陣變為&#xff1a; X X…

linux mysql提交_MySQL 事務提交過程

開發老大要求通過binlog查詢一條被修改的數據&#xff0c;數據被查出后問我&#xff0c;有沒有可能binlog中不會記錄&#xff0c;回答不會&#xff0c;因為數據被修改&#xff0c;若失敗直接回滾&#xff0c;不會在binlog中記錄&#xff0c;此刻一個朋友用了洪荒之力告訴我&…

spray.json_如何使用Spray-json(Un)在Akka HTTP中封送JSON

spray.jsonby Miguel Lopez由Miguel Lopez 如何使用Spray-json(Un)在Akka HTTP中封送JSON (How to (Un)marshal JSON in Akka HTTP with spray-json) In the previous post, we added JSON support to our Akka HTTP API using circe.在上一篇文章中 &#xff0c;我們使用circ…

React單元測試:Jest + Enzyme(二)

前言 在上一篇教程中&#xff0c;我們成功搭建了基于Jest和Enzyme的單元測試框架并成功地跑起來第一個單元測試&#xff0c;可以點擊這里回顧一下。今天&#xff0c;我們重點討論如何通過Jest來mock數據。 什么是Mock Mock的簡單翻譯就是模擬。既可以模擬數據&#xff0c;也可以…

input file 文件上傳,js控制上傳文件的大小和格式

文件上傳一般是用jquery的uploadify&#xff0c;比較好用。后面會出文章介紹uploadify這個插件。 但是&#xff0c;有時候為了偷懶&#xff0c;直接就用input 的file進行文件和圖片等的上傳&#xff0c;input file 可以控制上傳的格式&#xff0c;但是是html5&#xff0c;很多瀏…

leetcode面試題 17.08. 馬戲團人塔(二分法)

有個馬戲團正在設計疊羅漢的表演節目&#xff0c;一個人要站在另一人的肩膀上。出于實際和美觀的考慮&#xff0c;在上面的人要比下面的人矮一點且輕一點。已知馬戲團每個人的身高和體重&#xff0c;請編寫代碼計算疊羅漢最多能疊幾個人。 示例&#xff1a; 輸入&#xff1a;…