tornado學習筆記day06-應用安全

應用安全

cookie

普通cookie

一般我們的用戶表中都有啥呢

你在購物的時候,加入購物車,讓你登錄,那你登錄之后,他怎么知道你登錄了呢

token 這個值是隨機的,存在cookie里面

設置
  • 原型: 設置cookie 的方法
def set_cookie(self,name: str,value: Union[str, bytes],domain: str = None,expires: Union[float, Tuple, datetime.datetime] = None,path: str = "/",expires_days: int = None,**kwargs: Any) -> None:
  • 參數
    • name:我們設置的cookie的名字
    • value:cookie的值
    • domain:提交cookie時匹配的域名,也就是哪個ip拿過來的
    • path:提交cookie時匹配的路徑
    • expires:設置cookie的有效期,可以是時間磋整數,時間元組,datetime類型,為UTC時間
    • expires_days:設置cookie的有效期(天數)但是他的優先級低于expires
  • 實例:
原理

設置cookie實際上是通過設置headerSet-Cookie來實現的

獲取

我們設置完了就要獲取,為什么要獲取呢,因為以后我們在發送請求就要攜帶著這個cookie了

  • 原型:
def get_cookie(self, name: str, default: str = None) -> Optional[str]:
  • 參數:
    • name:要獲取的cookie 的名稱
    • default:如果名為name的獲取的cookie不存在,就走這個默認值了
  • 示例:
cookie = self.get_cookie("suck","未登錄")
print(cookie)
self.write("getcookie page info tornado!")
self.write(cookie)
清除
  • 原型:
    def clear_cookie(self, name: str, path: str = "/", domain: str = None) -> None:
  • 作用:
    • 刪除名為namecookie,并同時匹配domainpathcookie
    • 喲時候有可能這個name相同啊,那這個時候就得用path和domain來匹配一下了
  • 注意:
    • 執行cookie刪除后,并不是直接就刪除了,
    • 而是給cookie設置內容為null空,并刪除延遲時間,
    • 真正刪除是瀏覽器自己清理的,瀏覽器發現他沒有用的話就給他刪掉了,就看瀏覽器的了
  • 還有一個原型:
def clear_all_cookies(self, path: str = "/", domain: str = None) -> None:
  • 作用:刪除同時匹配path和domain的所有cookie
  • 示例:
# 清除cookie
class ClearPCookieHandler(RequestHandler):def get(self):# 這個刪除cookie后,他這次不能決定# 是下一次刪除了# 清除一個cookieself.clear_cookie("suck")# 清除所有cookieself.clear_all_cookies()self.write("ClearPCookieHandler page info tornado!")
安全cookie
概述:

cookie是存儲在客戶端瀏覽器的數據,很容易被篡改,不是很安全

tornado提供了一種對于cookie簡易的加密的方法,來防止cookie被惡意篡改

設置:
  • 需要為應用配置的進行混淆加密的秘鑰
  • 生成一個秘鑰:
    我們需要用到一個庫base64,你需要知道的就是他是加密的就行了,是一個唯一的標識,其他的你就不用管了,因為其他的你想管你也管不著了
    md5 現在已經不安全了,現在有一些網站已經能夠在線破解md5了

我們在python控制臺輸入如下代碼,即可生成一個uuid

base64.b64encode(uuid.uuid4().bytes+uuid.uuid4().bytes)
b'j94bbx0zSY6yYkCgawwJ1bzyM4jzDUuKtLyPC/MMmZA='

我們需要在配置文件config.py中進行配置
內容如下

settings = {# 這寫key的名字可不是隨便起的奧,是寫好的,# 就像upfile就沒有,你寫了也白扯'template_path': os.path.join(BASE_DIR, "templates"),'static_path': os.path.join(BASE_DIR, "static"),"debug": True,# "autoreload" : True"cookie_secret":"j94bbx0zSY6yYkCgawwJ1bzyM4jzDUuKtLyPC/MMmZA=",# 這個據說一百億年才能,用完
}

然后給你看一個方法,他的原型如下

    def set_secure_cookie(self,name: str,value: Union[str, bytes],expires_days: int = 30,version: int = None,**kwargs: Any) -> None:

作用:設置一個帶有簽名和時間戳的cookie,防止cookie被偽造

實際上是這樣寫的

# 安全cookie
class SCookieHandler(RequestHandler):def get(self):self.set_secure_cookie("victor","nice")self.write("SCookieHandler page info tornado!")

然后我們在瀏覽器中查看一下cookie的值

Set-Cookie: victor="2|1:0|10:1575853257|6:victor|8:bmljZQ
==|ac4c19c8598fc7c7d07c1484f07a0cc8e1a1adb022d084bcc3d3d4
75129fab63"; expires=Wed, 08 Jan 2020 01:00:57 GMT; Path=/

現在這個值,你看不出來內容是啥了
說明:

  • 安全cookie版本,默認使用2
  • 默認為0
  • 時間戳
  • cookie名
  • base64cookie編碼的值
  • 簽名值(不帶長度說明)
獲取:

直接就把原型往這里一扔

    def get_secure_cookie(self,name: str,value: str = None,max_age_days: int = 31,min_version: int = None,) -> Optional[bytes]:

然后我這么寫

# 獲取安全cookie
class GetSCookieHandler(RequestHandler):def get(self):sc = self.get_secure_cookie("victor")print(sc)self.write("getSCookieHandler page info tornado!")self.write(sc)

如果cookie驗證通過,就會返回這個cookie的值,否則返回None

max_age_days不同于expries_days設置的瀏覽器中cookie的有效時間
而max_age_days是過濾安全cookie的時間戳,默認是31天

注意:
  • 這個安全cookie,也不是絕對安全的,只是一定程度上增加了破解的難度
  • 以后cookie中不要存儲一些敏感性的數據

XSRF

跨站請求偽造代碼

示例:


# cookie計數
class CookieNumHandler(RequestHandler):def get(self):count = self.get_cookie("count",None)if count:# 第n次訪問count = str(int(count)+1)passelse:# 第一次訪問# 設置cookiecount = '0'self.set_cookie("count",count)self.render("cookienum.html",count = count)

頁面是這個樣子的:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>搞事情</title>
</head>
<body>
<h1>第{ { count } }次訪問</h1>
<p>搞事情網站,我就看看能不能搞壞!!!</p>
<div><img src="http://127.0.0.1:8080/cookienum" alt="">
</div>
</body>
</html>

當我們訪問搞事情網站的時候,當我們不知情的時候,未授權的情況下,cookie計數器網站中的cookie被使用,導致cookie計數器網站認為是他自己調用了Handler邏輯

上一個程序使用的是GET方式模擬的攻擊,為了防止這種攻擊,一般對于相對安全的操作一般不放在GET請求中.

我們常常使用的是POST請求

XSRF保護

同源:同域名同協議同端口
只有同源才讓他能訪問

開啟保護

在配置中添加

"xsrf_cookies":True

然后在這里別忘了也整一下

super(Application, self).__init__(handlers,# 模板路徑template_path=settings["template_path"],# 靜態路徑static_path=settings["static_path"],# cookie簽名cookie_secret=settings["cookie_secret"],xsrf_cookies=settings["xsrf_cookies"],
)

現在保護一開,誰都別想訪問了
那我們還要干什么?
我們怎么才能讓我們自身的能夠進行訪問啊

附加

配置文件中的鍵和值不用一個一個寫,直接就**打散就OK了

# 是不是傻了,這里直接就** 就行了
super(Application, self).__init__(handlers,**settings
)

應用

在模板中應用
在form表單中加上這么一句話,模板里面就能用了
{ % module xsrf_form_html() % }
完整的就這樣了
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Post page</title>
</head>
<body><form action="/postfile" method="post">{ % module xsrf_form_html() % }姓名:<input type="text" name="username"><hr/>密碼:<input type="password" name="password"><hr/><input type="submit" value="登錄"></form>
</body>
</html>
作用:
  • 為瀏覽器設置了_xsrf的安全cookie,這個cookie在關閉瀏覽器后就失效了
  • 為模板添加了一個隱藏的輸出,隱藏域,名為_xsrf,值為_xsrf這個cookie的值
  • 表單中的一個隱藏域,名為…值為…,但是還是不絕對安全
在非模板中應用
手動設置_xsrf的cookie
'''設置XsrfCookieHandler'''
class SetXsrfCookieHandler(RequestHandler):def get(self):# 設置一個_xsrf的cookieself.xsrf_tokenself.finish("OK")
第一種
  • 我們可以不在頁面中寫那一行代碼 而是寫一個script的JS代碼,其中實現手動的添加一個隱藏input
  • 手動創建input,并設置name的屬性值為_xsrf,value的屬性值為名為_xsrf的cookie的值
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Post page</title>
</head>
<body><form action="/postfile" method="post"><input id="hi" type="hidden" name="_xsrf" value="">姓名:<input type="text" name="username"><hr/>密碼:<input type="password" name="password"><hr/><input type="submit" value="登錄"></form><script>function getCookie(name) {// 這里寫的就不用管他是啥意思了var cook = document.cookie.match("\\b" + name + "=([^;]*)\\b");// 我們要返回的是cookie,不是cook// 如果有,那我就拿他的第一個值,就是這個cookie值return cook ? cook[1] : undefined}// 獲取cookiegc = getCookie("_xsrf");console.log(gc);document.getElementById("hi").value = gc;</script>
</body></html>
第二種

發起ajax請求:
我們把這個表單去掉,然后在js中點擊這個按鈕就發起ajax請求
我們沒有學過原生的ajax吧!那么就需要借助jQuery了吧!

具體代碼如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Post page</title><!--    導入jQuery--><script type="text/javascript" charset="utf-8" src="{{static_url('js/jquery.min.js')}}"></script>
</head>
<body><input id="hi" type="hidden" name="_xsrf" value="">
姓名:<input type="text" name="username">
<hr/>
密碼:<input type="password" name="password">
<hr/>
<input type="submit" value="登錄">
<button id="btn" onclick="login()">登錄</button>
<script>function getCookie(name) {// 這里寫的就不用管他是啥意思了var cook = document.cookie.match("\\b" + name + "=([^;]*)\\b");// 我們要返回的是cookie,不是cook// 如果有,那我就拿他的第一個值,就是這個cookie值return cook ? cook[1] : undefined}function login() {// 發起ajax請求我們有很多種方式// 發起post請求我們有兩種方式,一種是這個$.post("/postfile","_xsrf=" + getCookie("_xsrf") + "&username=" + "victor" + "&passwd=" + "123456",// 請求成功后的回調函數function (data) {alert("ok\\(^o^)/~");alert(data);});// TODO 其實這里要通過DOM元素獲取username,和passwd的值的,// TODO 因為這里不是作為重點就寫了/*** 這里主要是要帶著這個xsrf防護,不然這個是不能給你響應的*/}
</script>
</body></html>
第三種

其實這種才是最常用的方式,這個$.post僅僅只能發起post請求,所攜帶的參數或者說對于他的控制是比較少的
$.ajax才是最NB的方式

來吧!直接就上代碼

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Post page</title><!--    導入jQuery--><script type="text/javascript" charset="utf-8" src="{{static_url('js/jquery.min.js')}}"></script>
</head>
<body><input id="hi" type="hidden" name="_xsrf" value="">
姓名:<input type="text" name="username">
<hr/>
密碼:<input type="password" name="password">
<hr/>
<input type="submit" value="登錄">
<button id="btn" onclick="login()">登錄</button>
<script>function getCookie(name) {// 這里寫的就不用管他是啥意思了var cook = document.cookie.match("\\b" + name + "=([^;]*)\\b");// 我們要返回的是cookie,不是cook// 如果有,那我就拿他的第一個值,就是這個cookie值return cook ? cook[1] : undefined}function login() {// TODO 這塊還是那么回事,數據可以通過DOM來動態獲取data = {"username": "victor","passwd": "123456",};// 我們需要把我們的數據給他變成一個字符串// 這個方法是JS中的東西,不是python,jQuery的var data_str = JSON.stringify(data);// 這個ajax怎么寫呢?,他里面就一個參數,就是一個字典$.ajax({url: "/postfile",// 這個請求方式你寫啥,他就是啥,他都能發method: "POST",data: data_str,// 你看吧這個字典中的一個鍵里面對應的值是函數,// 雖然外面就一個字典類型的參數,但是回調函數還是有的success: function () {alert("ok!!!")},// 到這里絕壁是不能成功的,因為我這個_xsrf都沒寫怎么能成功呢// 如果想發起請求,我們還需要添加一個headers,也就是請求頭headers:{// 來這個跟著寫就對了// 這個值就設置成之前那個cookie值就行了"X-XSRFToken": getCookie("_xsrf"),},})// 以后發起ajax請求,建議使用這個,功能更加強大}
</script>
</body></html>
問題

其實帥的人是不會用第一種方式寫的

需要手動設置token
解決:其實一般我們進入一個網站的時候,通常是不是都先進入主頁啊,你進入主頁的時候就把這個xsrf寫進去了

首先我們添加一個進入主頁的靜態默認頁面

(r"/(.*)$",# 系統這個我們不能用,所以我們繼承,# tornado.web.StaticFileHandler,# 讓我們自己寫這個繼承自系統給我們這個index.MyStaticFileHandler,{"path": os.path.join(BASE_DIR, "static/html"),"default_filename": "index.html"}
),

然后重寫StaticFileHandler

from tornado.web import StaticFileHandler# 設置靜態默認
class MyStaticFileHandler(StaticFileHandler):# 我們用他的時候只需要重寫他的init就可以了def __init__(self,*args,**kwargs):super(MyStaticFileHandler,self).__init__(*args,**kwargs)self.xsrf_token
補充
  • _xsrf 加一個下劃線,我們把他看成是私有的
  • __xsrf就真的是私有的了

用戶驗證

概念

在收到用戶請求后,進行一個預先判斷用戶的認證狀態(是否登錄),若驗證通過正常處理,否則進入登錄界面去,滾去登錄

tornado.web.authenticate 裝飾器

tornado將確保這個方法的主體(他修飾的東西)只有合法的用戶才能調用

get_current_user

我們自己定義一個方法get_current_user()
功能:驗證用戶的邏輯,應該寫在該方法中,
如果該方法返回的為True說明驗證成功,否則驗證失敗
驗證失敗:訪客重定向到配置中的所制定的路由(登錄界面)
需要在配置文件config.py中寫上配置的位置,因為你不一定要跳轉到登錄界面吧!

"login_url":"/login",

這樣你要是沒登錄,他就給你踢到那個頁面中了

然后直接就上代碼

'''首先 路由是這樣的 '''
# 登錄界面
tornado.web.url(r"/login", index.LoginHandler,name='login'),
# home頁面
(r"/home", index.HomeHandler),
# 一個無名的普通頁面,用于測試的
(r"/cart", index.CartHandler),(r"/(.*)$",# 系統這個我們不能用,所以我們繼承,# tornado.web.StaticFileHandler,# 讓我們自己寫這個繼承自系統給我們這個index.MyStaticFileHandler,{"path": os.path.join(BASE_DIR, "static/html"),"default_filename": "index.html"}
),
'''登錄頁面'''
class LoginHandler(RequestHandler):def get(self):# 進入登錄我就要知道我是從哪里進的了next = self.get_argument("next","/")url = "login" + "?next=" + nextself.render("login.html", url=url)def post(self):'''咱也不用管是get還是post了name = self.get_body_argument("username")passwd = self.get_body_argument("passwd")'''# 直接我就寫name = self.get_argument("username")passwd = self.get_argument("passwd")# TODO 這里還是把賬號和密碼寫死了if name == "victor" and passwd == "123456":# 這個玩意代表從哪個頁面跳來的,處理完了# 要是沒毛病,我還得給你發到那里去next = self.get_argument("next", "/")# 后面"/"是默認值# 重定向走你,但是光重定向不行# 我們還得加一個標記self.redirect(next + "?flag=logined")else:next = self.get_argument("next", "/")'''# 驗證失敗了,# 路由的反向解析,聽著挺高大上的# 密碼輸入錯誤,好幾次也得記著人家是從哪里過來的'''log = self.reverse_url("login")+"?next="+next# 我還是得重定向self.redirect(log)
''' 這個是主頁面 '''
class HomeHandler(RequestHandler):def get_current_user(self):'''# 返回True代表驗證成功,否則涼涼# return False# 然后我們這里就能通過之前的flag來判斷了# 這里還要設置一個默認值否則就是# WARNING:tornado.general:400 GET /home (127.0.0.1):Missing argument flag'''flag = self.get_argument("flag", None)# 如果能取到flag,就返回true# 要是娶不到,自然就返回Falsereturn flag@tornado.web.authenticateddef get(self):self.render("home.html")
''' 這個cart是一個普通的頁面'''
class CartHandler(RequestHandler):def get_current_user(self):return self.get_argument("flag", None)@tornado.web.authenticateddef get(self):self.render("cart.html")

相似文章

tornado學習筆記day01
tornado學習筆記day02
tornado學習筆記day03
tornado學習筆記day04
tornado學習筆記day05
tornado學習筆記day06
tornado學習筆記day07
tornado學習筆記day08

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

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

相關文章

托福試卷真題_干貨解答考生疑惑,自考真題考過了還會在出嗎?

重視真題&#xff01;重視真題&#xff01;重視真題&#xff01;重要的話要說三遍。想自考的你們一定要注意&#xff0c;對于歷年真題&#xff0c;從來都是“備考必做”的態度。做自考真題&#xff0c;除了可以讓自己盡快熟悉考試題型和考點外&#xff0c;還有什么好處呢&#…

x264 struct學習 1

x264_t 結構體維護著CODEC的諸多重要信息 其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀&#xff0c;其類型已經確定&#xff1b;next是尚未確定類型的幀&#xff1b;unused用于回收不使用的frame結構體以備今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己還是太菜&#xff0c;補題離不開題解。。。 但還是留個博客&#xff0c;萬一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇見&#xff0c;學習了一下。不旋轉的時候可以得到 f[i]f[i-1]f[i-2] 斐波那契數列&#xff0c;旋轉后就可以通過…

tornado學習筆記day07-同步與異步

同步 概念 同步就是按部就班的依次執行我們的代碼 進階 但是有些情況我們有一些比較耗時的從操作,比如去別的地方拿點資源,去其他網站請求數據,去訪問數據庫,上傳文件等等,所以這里面優點瑕疵,有小編一一道來 比如這樣 本模塊的功能:<同步異步demo># 這個就相等于一個…

關鍵字: on

關鍵字: on 數據庫在通過連接兩張或多張表來返回記錄時&#xff0c;都會生成一張中間的臨時表&#xff0c;然后再將這張臨時表返回給用戶。 在使用left jion時&#xff0c;on和where條件的區別如下&#xff1a; 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管on中的條…

天融信安全接入客戶端_天融信提示您警惕物聯網設備Ripple20漏洞風險

近日&#xff0c;天融信阿爾法實驗室在JSOF實驗室發布的由Treck公司開發的TCP/IP軟件庫中獲取到一系列0day漏洞。JSOF實驗室發布的這批漏洞共計19個&#xff0c;被JSOF研究人員稱為"Ripple20"。受此軟件庫影響的產品數量估計超過數億&#xff0c;其中包括智能家居設備…

Service-Oriented Architecture,SOA(轉)

http://blog.csdn.net/WOOSHN/article/details/8036910 介紹&#xff1a; IT體系結構已非常成熟&#xff0c;它是一種成功處理典型IT問題的方法。體系結構中一個受到很大重視且相對較新的分支是面向服務的體系結構(SOA)。SOA經常被吹捧為企業用于解決應用程序靈活性和高維護成本…

tornado學習筆記day08-tornado中的異步

概述 應為epoll主要用來解決網絡的并發問題,所以tornado中的異步也是主要體現在網絡的IO異步上,即異步web請求 tornado.httpclient.AsyncHTTPClient tornado提供異步web請求客戶端,可以用來進行異步web請求, 這個客戶端和服務端是相對來說的,當tornado的Handler去其他位置去…

GreenSock (TweenMax) 動畫案例(二)

實現效果 動畫分解 1.燈光閃爍2.文字出現3.水流4.心電圖 知識點 1.AI(可盡情騷擾UI歐巴)2.SVG(了解基本的知識點)3.TweenMax(GreenSock)4.CSS animation 寫在前面 寫過第一篇文章后GreenSock (TweenMax) 動畫案例(一)再回頭看發現代碼太多&#xff0c;根本沒耐心去看完。所以每…

vue 用key拿對象value_利用 WeakMap 對 Vue 新建數組中的對象賦予 :key

需求在 Vue 中&#xff0c;對組件進行循環都需要加入key以便“就地復用”&#xff0c;可是在某些情況下&#xff0c;我們需要新建多個對象&#xff0c;而這些對象不是從后端獲取到的&#xff0c;而是前端生成的&#xff0c;沒有唯一值&#xff0c;且 Vue 目前版本只允許字符串&…

無限輪播圖片的實現原理

無限輪播圖相信是很多開發人員常用的一個功能&#xff0c;這里總結一下常用的兩種方式的實現原理 一、使用UIScrollview實現無限輪播用UIScrollView實現&#xff0c;在scrollView上添加3個UIImageView&#xff0c;分別用來顯示上一張圖片&#xff0c;當前顯示的圖片&#xff0c…

開啟 JM 的 trace 功能

[JM代碼] 開啟 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 編輯 城里漢子說過&#xff1a; trace文件對分析碼流結構很有效。我說的是trace文件&#xff0c;不是一步一步跟蹤&#xff0c;就是編解碼同時生成的 trace_enc.txt 這個文件&#xff0c;里面對每個比…

kafka入門介紹(轉載)

Kafka作為一個分布式的流平臺&#xff0c;這到底意味著什么&#xff1f; 我們認為&#xff0c;一個流處理平臺具有三個關鍵能力&#xff1a; 發布和訂閱消息&#xff08;流&#xff09;&#xff0c;在這方面&#xff0c;它類似于一個消息隊列或企業消息系統。 以容錯的方式存儲…

Cmd Markdown 編輯閱讀器

歡迎使用 Cmd Markdown 編輯閱讀器 我們理解您需要更便捷更高效的工具記錄思想&#xff0c;整理筆記、知識&#xff0c;并將其中承載的價值傳播給他人&#xff0c;Cmd Markdown 是我們給出的答案 —— 我們為記錄思想和分享知識提供更專業的工具。 您可以使用 Cmd Markdown&…

關于在smarty中實現省市區三級聯動

剛開始接觸php&#xff0c;&#xff0c;其實對于一些比較深入的東西還不是很了解&#xff0c;就像是這次的省市區聯動&#xff0c;都是用三張表為基礎編碼的&#xff0c;原諒我的無知&#xff0c;謝謝。 接下來就是編碼部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自動化發布和部署(1)

相關博文&#xff1a; Ubuntu 簡單安裝和配置 GitLabUbuntu 簡單安裝 DockerUbuntu Docker 簡單安裝 GitLabUbuntu Docker 安裝和配置 GitLab CI 持續集成服務器版本 Ubuntu 16.04 LTS。 經過上面四篇博文中的相關安裝和配置&#xff0c;我們主要完成了兩個容器的創建和運行&am…

X264學習筆記(1)

X264學習筆記&#xff08;1&#xff09; X264編碼流程 參數的初始化 1.opt&#xff0c;param根據輸入的參數和標準的規定&#xff0c;進行初始化設置。 Opt的說明如下&#xff1a; Opt->hin用于給出讀入的yuv文件的指針地址 Opt->hout給出了輸出的文件的指針地址 Opt->…

python 數字轉化excel行列_Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換...

Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母轉數字(python實現 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #實現從1對應Aif num > 25:while Tr…

錯誤提示:'……' is not assignable to Android.app.Activity Manifest XML

1 問題描述&#xff1a; 針對這段代碼&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

關于Lambda和匿名內部類

先上代碼&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…