摘要:就是把幾臺(tái)服務(wù)器主機(jī)合在一起,主要用于負(fù)載均衡,對(duì)客戶端訪問者來說像是一臺(tái)服務(wù)器。其實(shí)無(wú)非是把多個(gè)對(duì)象對(duì)外表現(xiàn)為一個(gè),實(shí)現(xiàn)負(fù)載均衡或者高可用。
1.sqlalchemy不自帶表更新,官方的遷移工具主要是 alembic和sqlalchemy migrate, 如果不使用工具,創(chuàng)建新表可以更新model后通過sqlalchemy的create_all方法,修改表字段則只能進(jìn)數(shù)據(jù)庫(kù)手動(dòng)改,同時(shí)更新model。
另外, sqlite在shell下執(zhí)行sql腳本的方式是:sqlite my.db < test.sql
(在客戶端命令行中,是:.read test.sql)
2.flask引用配置文件時(shí),有幾種方法,參考鏈接:https://zhuanlan.zhihu.com/p/...
主要要注意的是配置文件中,配置項(xiàng)必須以大寫形式,否則app.config的幾個(gè)讀配置文件的方法(from_object, from_pyfile等)都不會(huì)認(rèn)小寫的變量,官方文檔說明如下:
The configuration files themselves are actual Python files. Only values in uppercase are actually stored in the config object later on. So make sure to use uppercase letters for your config keys.
3.jquery的$(function () {})寫法,意思相當(dāng)于$(document).ready(function()),即文檔加載完再執(zhí)行。
摘:$(function () {})是$(document).ready(function())的簡(jiǎn)寫,也相當(dāng)于window.onload = function(){ }。雖然這段jquery代碼與javascript代碼在功能上可以互換,但執(zhí)行的時(shí)間不一樣,前者頁(yè)面框架加載完成就執(zhí)行,后者頁(yè)面中所有內(nèi)容加載完成才執(zhí)行
4.有的系統(tǒng)(比如debian)默認(rèn)用戶的命令環(huán)境是sh,而不是bash,導(dǎo)致命令行用起來不正常。
打開/etc/passwd,看到比如root:x:0:0:root:/root:/bin/sh,即定義root用戶默認(rèn)使用sh,而我們一般使用的是bash。改成/bin/bash即可
改為bash后,‘#"號(hào)前面的文字有時(shí)候是:-bash-4.2#,這個(gè)是由一個(gè)環(huán)境變量PS1決定的。這種情況下執(zhí)行一下echo $PS1,輸出是類似s-v$
要顯示成常見的類似[user@localhost ~]狀態(tài),可以改為[u@h w]$。
5.幾個(gè)技術(shù)名詞:
`raid -> disk` `ipvs -> host (loadbalancing)` `vrrp -> router (high-ability)` `bond -> network card` `(lvs = ipvs + vrrp)` 簡(jiǎn)單理解: raid就是把幾塊硬盤連在一起,達(dá)到提高存儲(chǔ)穩(wěn)定性的效果,對(duì)存儲(chǔ)者來說像是一塊硬盤。 ipvs就是把幾臺(tái)服務(wù)器主機(jī)合在一起,主要用于負(fù)載均衡,對(duì)客戶端訪問者來說像是一臺(tái)服務(wù)器。 vrrp就是多個(gè)路由器合在一起,主要用于高可用,對(duì)主機(jī)來說就像是一個(gè)路由器。 bond就是多個(gè)網(wǎng)卡合在一起,既可用于高可用也可用于負(fù)載均衡,對(duì)主機(jī)來說就像是一張網(wǎng)卡。 其實(shí)無(wú)非是把多個(gè)對(duì)象對(duì)外表現(xiàn)為一個(gè),實(shí)現(xiàn)負(fù)載均衡或者高可用。當(dāng)然細(xì)節(jié)就比較復(fù)雜了。
6.debian系下cron默認(rèn)使用run-parts命令執(zhí)行小時(shí)、天、周等定時(shí),man一下可知此命令用于執(zhí)行一個(gè)文件夾內(nèi)所有可執(zhí)行文件,但是ln了一個(gè)軟鏈到/etc/cron.hourly目錄下發(fā)現(xiàn)并不會(huì)執(zhí)行,手動(dòng)執(zhí)行run-parts也確實(shí)沒有輸出,原來是因?yàn)?b>run-parts這個(gè)命令,對(duì)于帶.sh后綴的不會(huì)執(zhí)行…
7.sqlalchemy 報(bào)錯(cuò):TypeError: an integer is required,這種情況一般是有數(shù)據(jù)項(xiàng)的值不符合數(shù)據(jù)類型,但不一定跟整型有關(guān),比如我就是給boolean類型的字段賦了個(gè)字符串的值就出現(xiàn)了這個(gè)報(bào)錯(cuò)。另外sqlite里boolean的值顯示出來是0和1.
8.關(guān)于flask上下文:
之前用django,習(xí)慣了進(jìn)python命令行,class request():DATA={}手動(dòng)編一個(gè)請(qǐng)求,然后直接實(shí)例化view對(duì)象,調(diào)對(duì)應(yīng)函數(shù)把request傳進(jìn)去即模擬了一次請(qǐng)求。
flask中請(qǐng)求并不直接作為參數(shù)傳遞到響應(yīng)的函數(shù)中,而是作為一個(gè)上下文環(huán)境中的類似全局變量(好像不同于普通全局變量,待繼續(xù)學(xué)習(xí))。因此,在flask中要實(shí)現(xiàn)類似django那樣命令行交互,需要些特殊處理,參考 http://flask.pocoo.org/docs/0...。
這里簡(jiǎn)單講下流程: main.py是我的view文件,其中實(shí)例化了Flask對(duì)象(app),get_all是其中一個(gè)響應(yīng)請(qǐng)求的函數(shù)。
>>> from main.main import * >>> d=app.test_request_context("shiki/?shiki=hahahahahaha") >>> print(get_all().get_data()) Traceback (most recent call last): File "", line 1, in File "E:workbenchflasksitemainmain.py", line 68, in get_all db = get_db() File "E:workbenchflasksitemainmain.py", line 80, in get_db if not hasattr(g, "db"): File "C:Program FilesPython36libsite-packageswerkzeuglocal.py", line 347, in __getattr__ return getattr(self._get_current_object(), name) File "C:Program FilesPython36libsite-packageswerkzeuglocal.py", line 306, in _get_current_object return self.__local() File "C:Program FilesPython36libsite-packagesflaskglobals.py", line 44, in _lookup_app_object raise RuntimeError(_app_ctx_err_msg) RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed to interface with the current application object in a way. To solve this set up an application context with app.app_context(). See the documentation for more information. >>> d.push() >>> print(get_all().get_data()) b"[ "hahahahahaha" ] " >>>
可以看到直接執(zhí)行g(shù)et_all是會(huì)提示Working outside of application context。創(chuàng)建一個(gè)test_request_context對(duì)象,傳入url作為參數(shù),并執(zhí)行push,就相當(dāng)于進(jìn)入了上下文環(huán)境,可以執(zhí)行了。d.pop可退出上下文環(huán)境。
ps:看起來比起用postman好像毫無(wú)優(yōu)勢(shì),不過有時(shí)候就是雙手不想離開鍵盤… (:з」∠)
9.python2, 標(biāo)準(zhǔn)庫(kù)urllib(2)和三方庫(kù)requests的差別
一圖流……
10.關(guān)于nfs配置
no_root_squash:登入 NFS 主機(jī)使用分享目錄的使用者,如果是 root 的話,那么對(duì)于這個(gè)分享的目錄來說,他就具有 root 的權(quán)限!這個(gè)項(xiàng)目『極不安全』,不建議使用! root_squash:在登入 NFS 主機(jī)使用分享之目錄的使用者如果是 root 時(shí),那么這個(gè)使用者的權(quán)限將被壓縮成為匿名使用者,通常他的 UID 與 GID 都會(huì)變成 nfsnobody 那個(gè)系統(tǒng)賬號(hào)的身份。
11.關(guān)于原生django(2.0.4)和rest_framework
在rest_framework中,封裝了data屬性,可以由這個(gè)統(tǒng)一接口拿到不同請(qǐng)求類型的數(shù)據(jù)。官方文檔如下:
request.data returns the parsed content of the request body. This is
similar to the standard request.POST and request.FILES attributes
except that:· It includes all parsed content, including file and non-file inputs.
· It supports parsing the content of HTTP methods other than POST,
meaning that you can access the content of PUT and PATCH requests.
· It supports REST framework"s flexible request parsing, rather than
just supporting form data. For example you can handle incoming JSON
data in the same way that you handle incoming form data.
在django中,request對(duì)象有request.GET和request.POST方法分別用于獲取數(shù)據(jù),但POST不能獲取application/json類型的請(qǐng)求體。
json數(shù)據(jù)只能在request.body屬性中拿到,是一個(gè)bytes類型(python3),需要json.loads轉(zhuǎn)為字典。
沒有一個(gè)像rest_framework那樣的統(tǒng)一接口拿各種請(qǐng)求類型的數(shù)據(jù)。如果要做到那樣,一種解決辦法是和前端約定請(qǐng)求體全部用json,然后寫個(gè)中間件。類似:
try: request.DATA = json.loads(request.body) except json.decoder.JSONDecodeError: xxx
注意中間件不應(yīng)該去訪問request.POST.
Accessing request.POST inside middleware before the view runs or in process_view() will prevent any view running after the middleware from being able to modify the upload handlers for the request, and should normally be avoided.
當(dāng)然也可以get和post明確各自用,json再另外一個(gè)接口,關(guān)于這一點(diǎn)好像沒有找到風(fēng)格指南。直覺來說肯定是統(tǒng)一接口方便。
我的情況是公司原本項(xiàng)目用了rest_framework,而我最近的任務(wù)要擼個(gè)獨(dú)立的系統(tǒng),我打算純用django。關(guān)于我們?yōu)槭裁匆褂?b>rest_framework,見:
When should i use django-rest-framework?
11.關(guān)于gevent.subprocess.Popen
gevent.subprocess.Popen使用數(shù)組作為參數(shù)(shell=False)時(shí)元素必須都為字符串類型,否則會(huì)拋出異常--- execv() arg 2 must contain only strings
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93466.html
摘要:就是把幾臺(tái)服務(wù)器主機(jī)合在一起,主要用于負(fù)載均衡,對(duì)客戶端訪問者來說像是一臺(tái)服務(wù)器。其實(shí)無(wú)非是把多個(gè)對(duì)象對(duì)外表現(xiàn)為一個(gè),實(shí)現(xiàn)負(fù)載均衡或者高可用。 1.sqlalchemy不自帶表更新,官方的遷移工具主要是 alembic和sqlalchemy migrate, 如果不使用工具,創(chuàng)建新表可以更新model后通過sqlalchemy的create_all方法,修改表字段則只能進(jìn)數(shù)據(jù)庫(kù)手動(dòng)改,...
摘要:一些知識(shí)點(diǎn)有哪些方法方法前端從入門菜鳥到實(shí)踐老司機(jī)所需要的資料與指南合集前端掘金前端從入門菜鳥到實(shí)踐老司機(jī)所需要的資料與指南合集歸屬于筆者的前端入門與最佳實(shí)踐。 工欲善其事必先利其器-前端實(shí)習(xí)簡(jiǎn)歷篇 - 掘金 有幸認(rèn)識(shí)很多在大廠工作的學(xué)長(zhǎng),在春招正式開始前為我提供很多內(nèi)部推薦的機(jī)會(huì),非常感謝他們對(duì)我的幫助。現(xiàn)在就要去北京了,對(duì)第一份正式的實(shí)習(xí)工作也充滿期待,也希望把自己遇到的一些問題和...
摘要:前言羅子雄如何成為一名優(yōu)秀設(shè)計(jì)師董明偉工程師的入門和進(jìn)階董明偉基于自己實(shí)踐講的知乎為新人提供了很多實(shí)用建議,他推薦的羅子雄如何成為一名優(yōu)秀設(shè)計(jì)師的演講講的非常好,總結(jié)了設(shè)計(jì)師從入門到提高的優(yōu)秀實(shí)踐。 前言 羅子雄:如何成為一名優(yōu)秀設(shè)計(jì)師 董明偉:Python 工程師的入門和進(jìn)階 董明偉基于自己實(shí)踐講的知乎live為Python新人提供了很多實(shí)用建議,他推薦的羅子雄:如何成為一名優(yōu)秀...
摘要:其他語(yǔ)言數(shù)據(jù)結(jié)構(gòu)跟算法一樣是在開始寫代碼的時(shí)候用得很少,都有著包裝好的現(xiàn)成東西供你使用,但同樣是面試和崗位上升會(huì)用得到,我就不說數(shù)據(jù)結(jié)構(gòu)對(duì)代碼有多少好處,請(qǐng)記住一句話能夠?qū)崿F(xiàn)個(gè)功能和能夠最優(yōu)地實(shí)現(xiàn)個(gè)功能,是完全不同級(jí)別的要求。 ...
閱讀 3022·2021-11-18 10:07
閱讀 3765·2021-11-17 17:00
閱讀 2103·2021-11-15 18:01
閱讀 926·2021-10-11 10:58
閱讀 3373·2021-09-10 10:50
閱讀 3442·2021-08-13 15:05
閱讀 1229·2019-08-30 15:53
閱讀 2640·2019-08-29 13:01