2015-09-28 57 views
3

我可以使用django處理 http請求和響應嗎?我有一個django web應用程序提供網頁,我想用它通過tcp與其他設備(手持gps發送狀態報告和接收ack)進行通信,但django報告請求是「對非http請求使用django

code 400, message Bad HTTP/0.9 request type". 

    [28/Sep/2015 15:14:26] code 400, message Bad HTTP/0.9 request type ('[V1.0.0,244565434376396,1,abcd,2015-09-28') 
    [28/Sep/2015 15:14:26] "[V1.0.0,244565434376396,1,abcd,2015-09-28 14:14:12,1-2,865456543459367,2,T1]" 400 - 

從設備的消息作爲文本發送通過TCP沒有HTTP參數可言。

我還沒有找到如何使用Django這樣做的任何信息,但它讓我的生活更容易,如果它是可能的。

謝謝!

+1

這裏的問題很可能是您的web服務器(apache?)服務於該網站,因爲它被編程爲接受HTTP(s)連接。我很確定,當你想接受非HTTP連接時,會給你帶來問題。您可能需要打開自己的套接字才能接受此類連接。不知道如何與django一起工作,因爲它通常需要http請求。 – Tim

+0

謝謝!看來我必須在django之外實現一些東西。 – Svante

回答

1

不是我所知道的。

Django是一個web框架,所以它的設計圍繞一定的模式,如果沒有一定的協議

設計是通知 - 如果不是通過HTTP - 通過URL,請求,無狀態協議,等等的概念。

如果模板系統和路由系統被拿走,你會留下光榮的ORM和一些無用的代碼位。

但是,除非你是在處理與現有設備與自己的協議,你可以使用Django來建立RESTful服務成功比在網絡瀏覽器的前面兩足動物以外的東西交換信息。

This article on Dr. Dobb's是非常豐富的。

Django REST,儘管沒有必要,可以幫助你。

如果你真的堅持了傳統設備和協議,你可以適配器/代理將收到您的設備的請求,並將它們轉換爲基於REST調用,如果你的協議看起來足夠像HTTP在語義上而不是語法上(如果你只需要翻譯QUUX aaa:bbb:ccc:GET xx/yy/zz)。

如果它沒有分享最細微的HTTP語義,我會說Django不能幫你太多。

+1

感謝您的提示,但不幸的是REST無法使用,因爲我無法觸摸設備。我有點想通了,因爲我發現沒有關於非http請求的信息,所以我對此感到失望。 – Svante

+0

@Svante:正如我上面提到的,你*可以考慮將一個適配器寫入一個RESTful服務。你可能想要權衡利弊。以* cum grano salis *爲例,但是你會考慮使用Django,這讓我懷疑你的協議是...... webb-ish就夠了。 –

+0

絕對!我認爲這可能是最好的方法。我目前正在尋找與SocketServer的解決方案,我發現[Django TCP套接字通信](http://stackoverflow.com/questions/29307916/django-tcp-socket-communication)將請求轉發給主應用程序。 – Svante

0

我第二個建議,你可以更好地處理非http與其他方法,但我有一個建議,如何構建一個Django應用程序可以做到這一點。 HTTP處理髮生在中間件中,你可以讓你的應用程序位於堆棧的頂部,並通過返回響應而不是將它傳遞給堆棧或準備模擬請求傳遞給其他處理程序來搶佔其他中間件,在返回的過程中抓取響應,爲您的接收器進行後期處理。

這感覺很難受,可能需要一堆非正統的技巧,但這就是我如何處理所述的問題。

+0

謝謝!嗯,這可以工作,我現在正在看使用SocketServer的解決方案,但我只是可能檢查你的建議更接近一點:) – Svante