Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
近剛優(yōu)化完Django后臺界面JSON格式數(shù)據(jù)的展示,讓我感受到一點小小成就感。優(yōu)化過程中,我特別想寫一篇技術(shù)博客,說一說整個實現(xiàn)流程;待功能做完,又感覺似乎能說的內(nèi)容極少——這個優(yōu)化,是很簡單的。(我常有類似感受,一個東西花了很長時間才處理掉,處理完畢之后會覺得如此簡單并開始質(zhì)疑自己如何花了許多時間?)
// 有中文的JSON
{"insun": "\u6cf0\u56e7 / \u4eba\u5728\u56e7\u90142 / Lost in Thailand "}
JSON數(shù)據(jù),包含中文之后看起來亂亂的,會影響我工作效率。我想明白它的具體內(nèi)容,需要將它的內(nèi)容復(fù)制到一個工具網(wǎng)站上進行查看。我要將這復(fù)制粘貼再點一下的過程去掉,我要我所見到的是我能看懂的!
谷歌了一下,似乎做這個優(yōu)化的程序員并不多,只有一個叫做Django-JSONEditor的自定義控件可用。
按照作者的步驟能夠很方便的將問題解決。我因為上面的一個廣告按鈕而拒絕使用,我以為這廣告是Django-JSONEditor加上的,于是自己模仿它的實現(xiàn)做一個自定義控件將其搬到Django中。搬的過程遇見靜態(tài)資源加載不出來的情況,又一通谷歌,彎彎繞繞的在Django層處理。
待這一步做完,發(fā)現(xiàn)廣告按鈕依然在,才發(fā)現(xiàn)是藏在JSON Editor中的物件,將JS文件中的對應(yīng)代碼干掉,便沒有廣告了。于是知道前端的內(nèi)容,發(fā)布到互聯(lián)網(wǎng)是會壓縮打包的。
本機環(huán)境OK后,部署到測試機上,發(fā)現(xiàn)靜態(tài)資源依然不在,這讓我接觸到Nginx。理解Nginx的(極小部分)使用方式,將它搞定,至此優(yōu)化結(jié)束。
GitHub上的效果圖
怎么說呢?轉(zhuǎn)行之后,除了主要使用語言(Python)與敲代碼的風(fēng)格(可能可以說是設(shè)計模式吧)不變,我是接觸到許多新技術(shù)的。
蘋果電腦與Git,是已經(jīng)可以熟練使用的基礎(chǔ)工具。
HTTP協(xié)議,感覺已經(jīng)快有一個大概框架印在心中。以看書的方式了解全局框架之后會是TCP與IP的學(xué)習(xí)。
Docker(容器),認識到它是什么并能進行基礎(chǔ)運用。在容器的上層,據(jù)說還有管理容器的集群(K8S)。
Nginx,是剛接觸的。現(xiàn)階段可以看懂它的基礎(chǔ)配置,能夠稍微改改,但自己寫就還差點意思。
HTML與JS,似乎已經(jīng)藏在幾個很復(fù)雜的框架后面,要想看到它們,必須先熟悉框架。
許多的我沒了解到的內(nèi)容在等待我去發(fā)現(xiàn)。
半年以來,一直在不停地拓展知識廣度,我的Python深度之旅,斷斷續(xù)續(xù)。謹以此篇說明,我的內(nèi)功修煉之路,是在前行的。
未來還長,未完待續(xù)。
引用鏈接:
JSON Editor的GitHub地址:https://github.com/json-editor/json-editor
Django-JSONEditor,有人封裝的Django版本,按照上面的指引,可以很快用起來:https://github.com/nnseva/django-jsoneditor
在線JSON轉(zhuǎn)義工具:https://c.runoob.com/front-end/53/
用一年時間如何能掌握 C++ ?:https://www.zhihu.com/question/23933514/answer/26290066
本文件的批量性操作,Excel催化劑已經(jīng)有非常多的功能,常聽說許多人對Excel催化劑的印象是功能太雜,但試問,不是活在真空世界中做數(shù)據(jù)分析,面對一大堆雜亂的數(shù)據(jù)環(huán)境,沒有足夠“雜”的功能來應(yīng)付,真的可以稱得上數(shù)據(jù)神器么?
本篇的兩個小功能,處理下一般數(shù)據(jù)采集獲取到的非理想文本數(shù)據(jù):帶unicode字符串的文本和帶html特殊符號的文本。這些功能也是從實際需求中來。為了讓數(shù)據(jù)處理更加得心應(yīng)手,功能仍然不斷新增。
這里說的網(wǎng)頁采集,當然可以最原始的從網(wǎng)頁上復(fù)制粘貼回來的數(shù)據(jù),更自動化的,就是使用網(wǎng)頁采集工具批量性獲取到的數(shù)據(jù)。
網(wǎng)頁html文本,有轉(zhuǎn)義字符如: <(小于號<) 、 >(大于號>) 、 (空格)等,這些因為html上有特定的含義,需要轉(zhuǎn)義成其他輸入字符。
更多的可見下文截圖:
最終我們還原后,應(yīng)該得到下面的文本才是想要的。
我們采集到的數(shù)據(jù)中,可能會是以下展示的樣式,非英文、數(shù)字的比如中文,用了Unicode字符表示(\u開頭的)。
我們需要這樣的格式,才是人閱讀和使用的文本。
既然這么大的共性情況,肯定是將它落實到功能上固化,有再次出現(xiàn)時可以立馬解決,這就是Excel催化劑越來越“雜”的由來。
處理一個文件,你說在線轉(zhuǎn)換下就可以,處理100個、1000個呢,還會這樣去做嗎?在Excel催化劑里,必然是批量性操作最佳使用場合。
如果數(shù)據(jù)已經(jīng)落到Excel的單元格里,在做網(wǎng)頁采集功能時,其實已經(jīng)將此成套的網(wǎng)頁采集相關(guān)會用到的功能都做成了自定義函數(shù)。
如下的將html的轉(zhuǎn)義字符解碼
同樣地,Unicode字符串還原為原字符,也有自定義函數(shù)。
除此以外,還有大量的轉(zhuǎn)換Utf8、從json提取、從xml提取指定元素、Url轉(zhuǎn)碼和還原等一大堆自定義函數(shù)。
上述自定義函數(shù)使用場景,數(shù)據(jù)源在Excel單元格或提取結(jié)果存儲在Excel單元格,另如果是對整個文件的轉(zhuǎn)換,就是本篇開發(fā)的兩個小功能。
使用非常簡單,選擇一個或多個待轉(zhuǎn)換的文本文件路徑單元格,當只選擇待轉(zhuǎn)換時,轉(zhuǎn)換后的結(jié)果覆蓋原文件,選擇兩列時,右側(cè)列為轉(zhuǎn)換結(jié)果生成新文本,建議采用新生成文件方式。
任何覆蓋原始文件的操作均有數(shù)據(jù)風(fēng)險,無法恢復(fù)數(shù)據(jù)初始狀態(tài),不是一個好的科學(xué)的數(shù)據(jù)管理方式。
小功能有大智慧,你能感受到了嗎?盼望Excel催化劑的使用者,會因為其功能的不斷新增而驚喜,因為又有新的繁瑣操作被簡單固化了。
看到小小的Excel催化劑包含這么多的功能,來應(yīng)對各種數(shù)據(jù)采集、處理、分析各環(huán)節(jié)的痛點,希望催化劑的使用者們,都有慧眼,不用再相信培訓(xùn)機構(gòu)所吹噓的培訓(xùn)一小時,從此不加班的收割式的忽悠大法。
應(yīng)對功能越來越多,請始終堅守最佳的Excel催化劑使用方法:搜索+筆記,用到時即搜即得,日常追更下文章。寫文章者1小時,讀文章者2分鐘即可。
路是方向,代碼是時間,知識需積累,經(jīng)驗需摸索。希望對大家有用,有錯誤還望指出。
HttpResponse 的其他使用方法和注意事項。
除了返回字符串和二進制數(shù)據(jù)以外,HttpResponse 還可以返回 JSON 格式的數(shù)據(jù)。這通常用于構(gòu)建 Web API,讓客戶端能夠方便地獲取數(shù)據(jù)并進行處理。
下面是一個返回 JSON 數(shù)據(jù)的例子:
import json
from django.http import HttpResponse
def my_api(request):
data={'foo': 'bar', 'baz': [1, 2, 3]}
json_data=json.dumps(data)
response=HttpResponse(json_data, content_type='application/json')
return response
在這個例子中,我們首先使用 Python 自帶的 json 模塊將一個字典轉(zhuǎn)換成 JSON 格式的字符串,然后將其作為響應(yīng)內(nèi)容傳遞給 HttpResponse 對象。最后,我們設(shè)置 content_type 參數(shù)為 application/json,表示該響應(yīng)是一個 JSON 格式的數(shù)據(jù)。
除了 HttpResponse 以外,Django 還提供了其他一些響應(yīng)類來方便我們進行重定向、錯誤處理等操作。其中,HttpRedirect 是用于重定向的響應(yīng)類之一。
例如,如果我們希望將用戶重定向到另一個 URL 上,可以這樣寫:
from django.http import HttpResponseRedirect
def my_view(request):
return HttpResponseRedirect('/another-url/')
在這個例子中,我們創(chuàng)建了一個 HttpResponseRedirect 對象,并將其目標 URL 設(shè)置為 /another-url/。當客戶端收到該響應(yīng)時,它會自動跳轉(zhuǎn)到該 URL,并展示相應(yīng)的內(nèi)容。
除了直接返回整個響應(yīng)內(nèi)容以外,Django 還提供了 StreamingHttpResponse 類,可以用于按需生成、傳輸響應(yīng)內(nèi)容。這對于處理大量數(shù)據(jù)或需要逐步生成響應(yīng)內(nèi)容的場景非常有用。
例如,如果我們希望生成一個包含隨機數(shù)的 CSV 文件并將其作為響應(yīng)傳遞給客戶端,可以這樣寫:
import csv
import random
from django.http import StreamingHttpResponse
def generate_csv():
yield 'id,value\n'
for i in range(100000):
value=random.randint(1, 1000)
yield f'{i},{value}\n'
def my_view(request):
response=StreamingHttpResponse(generate_csv(), content_type='text/csv')
response['Content-Disposition']='attachment; filename="data.csv"'
return response
在這個例子中,我們定義了一個名為 generate_csv 的生成器函數(shù),它會按照 CSV 格式生成一系列隨機數(shù),并逐行生成響應(yīng)內(nèi)容。然后,我們使用 StreamingHttpResponse 類創(chuàng)建一個流式響應(yīng)對象,并將生成器函數(shù)作為參數(shù)傳遞給該對象。最后,我們設(shè)置 content_type 參數(shù)為 text/csv,表示該響應(yīng)是一個 CSV 格式的文件,并使用 Content-Disposition 頭信息告訴客戶端該響應(yīng)應(yīng)該被下載保存。
最后,需要特別注意的是,在編寫 HttpResponse 代碼時,我們需要注意防止跨站腳本攻擊(XSS)。XSS 攻擊是指攻擊者通過在網(wǎng)頁中注入惡意腳本來攻擊用戶瀏覽器的一種漏洞。
為了防止 XSS 攻擊,我們應(yīng)該始終對響應(yīng)內(nèi)容進行轉(zhuǎn)義,并使用相應(yīng)的安全函數(shù)來處理輸入數(shù)據(jù)。例如,在 Django 中,可以使用 escapejs 和 escapeHTML 函數(shù)來分別對 JavaScript 和 HTML 進行轉(zhuǎn)義。
from django.http import HttpResponse
from django.utils.html import escape
def my_view(request):
data=request.GET.get('data')
escaped_data=escape(data)
response=HttpResponse(f'You entered: {escaped_data}')
return response
在這個例子中,我們通過 request.GET.get 方法獲取了一個名為 data 的 GET 參數(shù),并使用 escape 函數(shù)對其進行了 HTML 轉(zhuǎn)義。然后,我們將轉(zhuǎn)義后的數(shù)據(jù)作為響應(yīng)內(nèi)容返回給客戶端。這樣就可以避免惡意腳本被注入到響應(yīng)內(nèi)容中,從而保護用戶的安全。
另外,Django 還提供了一些安全函數(shù)來幫助我們防止 XSS 攻擊。以下是一些常用的安全函數(shù):
例如,在 Django 模板中,我們可以使用如下方式對變量進行轉(zhuǎn)義:
<p>{{ my_variable|escape }}</p>
在這個例子中,我們使用了模板語法中的過濾器,將 my_variable 變量的值進行了 HTML 轉(zhuǎn)義。這樣即使該變量包含惡意腳本,也不會對用戶造成威脅。
總之,XSS 攻擊是一種非常嚴重的漏洞,我們應(yīng)該時刻注意防范,并采取相應(yīng)的措施來保護用戶的安全。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。