
我厭倦了打字manage.py startserver 10.211.55.4:4000
,所以我決定為此創建一個別名。唯一的問題是:連接埠有時會發生變化。所以我在 bash 設定檔中這樣做了:
function runserver() {
python manage.py runserver 10.211.55.4:$1
}
但是當我調用它時:runserver 3000
它啟動它,但立即停止說:
「錯誤:無法指派該 IP 位址」。但是,如果我直接在命令列中輸入相同的內容,它就可以毫無抱怨地工作。
答案1
按照您最初的嘗試,您可以將該函數調整為以下內容:
function runserver() {
python manage.py runserver 10.211.55.4:$PORT
}
然後這樣稱呼它:
PORT=3000 runserver
答案2
這實際上是當你向 Python/Django 提供一個它無法綁定的 IP 位址(不屬於系統的一部分)時從 Python/Django 返回的錯誤,如下面的真實的、剛剛運行的範例所示:
$ python manage.py runserver 123.123.123.123:8000
Validating models...
0 errors found
June 03, 2014 - 22:36:58
Django version 1.5.7, using settings 'tv.settings'
Development server is running at http://123.123.123.123:8000/
Quit the server with CONTROL-C.
Error: That IP address can't be assigned-to.
因此,您要么需要修復您的 IP 位址(查看輸出ifconfig --all
以了解可用的內容),要么只需使用以下命令綁定到所有這些位址:
function runserver() {
python manage.py runserver 0:$1
}
bash 方面的事情是合理的。
答案3
你做對了。
我懷疑您在測試中遇到了網路問題,而失敗的測試使用該函數的事實純屬巧合。當您關閉 TCP 連線時,連接埠會在一小段時間(30 秒)內保持使用狀態,以防存在尚未收到的待處理封包(封包可能會亂序到達)。這是TIME_WAIT
狀態。為了讓新伺服器立即重新啟動,設置SO_REUSEADDR
標誌與setsockopt
(Python中有一個例子socket
文件).
答案4
我們可以使用群組命令{ list; }
和此處字串<<<
重定向來建立別名。關鍵目標是重定向stdin
到命令。下面介紹了幾種方法
alias runserver='{ xargs -I % python manage.py runserver 10.211.55.4:%;} <<<'
alias runserver='{ IFS= read -r port; python manage.py runserver 10.211.55.4:"$port";} <<<'
alias runserver='{ port=$(line); echo python manage.py runserver 10.211.55.4:"$port";} <<<'
請注意後面需要空格{
,前面}
需要分號。