最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Django3中直接添加Websockets方式

 更新時(shí)間:2020年02月12日 08:26:39   作者:mindg.cn  
這篇文章主要介紹了Django3中直接添加Websockets方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)在Django 3.0附帶了對ASGI的支持,將Websockets添加到Django應(yīng)用中不需要任何額外的依賴關(guān)系。 在本文中,您將學(xué)習(xí)如何通過擴(kuò)展默認(rèn)的ASGI應(yīng)用程序來使用Django處理Websocket。 我們將介紹如何在示例ASGI應(yīng)用程序中處理Websocket連接,發(fā)送和接收數(shù)據(jù)以及實(shí)現(xiàn)業(yè)務(wù)邏輯。

入門

首先,您需要在計(jì)算機(jī)上安裝Python> = 3.6。 Django 3.0僅與Python 3.6及更高版本兼容,因?yàn)樗褂昧薬sync和await關(guān)鍵字。 完成Python版本設(shè)置后,創(chuàng)建一個(gè)項(xiàng)目目錄并CD進(jìn)入。 然后,將Django安裝在virtualenv內(nèi),并在您的項(xiàng)目目錄中創(chuàng)建一個(gè)新的Django應(yīng)用:

$ mkdir django_websockets && cd django_websockets
$ python -m venv venv
$ source venv/bin/activate
$ pip install django
$ django-admin startproject websocket_app .

看一下Django應(yīng)用程序的websocket_app目錄。 您應(yīng)該看到一個(gè)名為asgi.py的文件。 其內(nèi)容如下所示:

import os
 
from django.core.asgi import get_asgi_application
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings')
 
application = get_asgi_application()

該文件提供了默認(rèn)的Django ASGI設(shè)置,并公開了一個(gè)名為application的ASGI應(yīng)用程序,可以使用uvicorn或daphne等ASGI服務(wù)器運(yùn)行該應(yīng)用程序。 在進(jìn)一步介紹之前,讓我們看一下ASGI應(yīng)用程序的結(jié)構(gòu)。

ASGI應(yīng)用程序結(jié)構(gòu)

ASGI或“異步服務(wù)器網(wǎng)關(guān)接口”是用于使用Python構(gòu)建異步Web服務(wù)的規(guī)范。它是WSGI的精神繼承者,WSGI已被Django和Flask等框架使用了很長時(shí)間。 ASGI使您可以使用Python的本機(jī)異步/等待功能來構(gòu)建支持長期連接的Web服務(wù),例如Websockets和Server Sent Events。

ASGI應(yīng)用程序是一個(gè)異步函數(shù),它帶有3個(gè)參數(shù):作用域(當(dāng)前請求的上下文),接收(一個(gè)異步函數(shù),可讓您偵聽傳入的事件)和發(fā)送(一個(gè)異步函數(shù),可將事件發(fā)送至客戶端)。

在ASGI應(yīng)用程序內(nèi)部,您可以根據(jù)范圍字典中的值路由請求。例如,您可以通過檢查scope [‘type']的值來檢查該請求是HTTP請求還是Websocket請求。要偵聽來自客戶端的數(shù)據(jù),您可以等待接收功能。準(zhǔn)備好將數(shù)據(jù)發(fā)送到客戶端時(shí),可以等待發(fā)送功能,然后將要發(fā)送給客戶端的任何數(shù)據(jù)傳遞給客戶端。讓我們看一下這在示例應(yīng)用程序中是如何工作的。

創(chuàng)建一個(gè)ASGI應(yīng)用

在我們的asgi.py文件中,我們將使用我們自己的ASGI應(yīng)用程序包裝Django的默認(rèn)ASGI應(yīng)用程序功能,以便自己處理Websocket連接。為此,我們需要定義一個(gè)名為application的異步函數(shù),該函數(shù)需要3個(gè)ASGI參數(shù):scope,receive和send。將get_asgi_application調(diào)用的結(jié)果重命名為django_application,因?yàn)槲覀冃枰幚鞨TTP請求。在我們的應(yīng)用程序函數(shù)內(nèi)部,我們將檢查scope [‘type']的值以確定請求類型。如果請求類型為“ http”,則該請求為普通的HTTP請求,我們應(yīng)該讓Django處理它。如果請求類型為“ websocket”,那么我們將自己處理邏輯。生成的asgi.py文件應(yīng)如下所示:

import os
 
from django.core.asgi import get_asgi_application
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings')
 
django_application = get_asgi_application()
 
async def application(scope, receive, send):
  if scope['type'] == 'http':
    # Let Django handle HTTP requests
    await django_application(scope, receive, send)
  elif scope['type'] == 'websocket':
    # We'll handle Websocket connections here
    pass
  else:
    raise NotImplementedError(f"Unknown scope type {scope['type']}")

現(xiàn)在,我們需要?jiǎng)?chuàng)建一個(gè)函數(shù)來處理Websocket連接。 在與asgi.py文件相同的文件夾中創(chuàng)建一個(gè)名為websocket.py的文件,并定義一個(gè)名為websocket_application的ASGI應(yīng)用程序函數(shù),該函數(shù)接受3個(gè)ASGI參數(shù)。 接下來,我們將在我們的asgi.py文件中導(dǎo)入websocket_application,并在我們的應(yīng)用程序函數(shù)內(nèi)部調(diào)用它來處理Websocket請求,傳入范圍,接收和發(fā)送參數(shù)。 它看起來應(yīng)該像這樣:

# asgi.py
import os
 
from django.core.asgi import get_asgi_application
from websocket_app.websocket import websocket_application
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings')
 
django_application = get_asgi_application()
 
async def application(scope, receive, send):
  if scope['type'] == 'http':
    await django_application(scope, receive, send)
  elif scope['type'] == 'websocket':
    await websocket_application(scope, receive, send)
  else:
    raise NotImplementedError(f"Unknown scope type {scope['type']}")
 
# websocket.py
async def websocket_application(scope, receive, send):
  pass

接下來,讓我們?yōu)閃ebsocket應(yīng)用程序?qū)崿F(xiàn)一些邏輯。我們將監(jiān)聽所有Websocket連接,當(dāng)客戶端發(fā)送字符串“ ping”時(shí),我們將以字符串“ pong!”進(jìn)行響應(yīng)。

在websocket_application函數(shù)內(nèi)部,我們將定義一個(gè)不確定的循環(huán),該循環(huán)將處理Websocket請求,直到關(guān)閉連接。在該循環(huán)內(nèi),我們將等待服務(wù)器從客戶端收到的任何新事件。然后,我們將根據(jù)事件的內(nèi)容采取行動(dòng),并將響應(yīng)發(fā)送給客戶端。

首先,讓我們處理連接。當(dāng)新的Websocket客戶端連接到服務(wù)器時(shí),我們將收到“ websocket.connect”事件。為了允許這種連接,我們將發(fā)送一個(gè)“ websocket.accept”事件作為響應(yīng)。這將完成Websocket握手并與客戶端建立持久連接。

當(dāng)客戶端終止其與服務(wù)器的連接時(shí),我們還需要處理斷開連接事件。為此,我們將監(jiān)聽“ websocket.disconnect”事件。當(dāng)客戶端斷開連接時(shí),我們將擺脫不確定的循環(huán)。

最后,我們需要處理來自客戶端的請求。為此,我們將監(jiān)聽“ websocket.receive”事件。當(dāng)我們從客戶端收到“ websocket.receive”事件時(shí),我們將檢查event [‘text']的值是否為“ ping”。如果是,我們將發(fā)送一個(gè)'websocket.send'事件,其文本值為'pong!'。

設(shè)置Websocket邏輯后,我們的websocket.py文件應(yīng)如下所示:

# websocket.py
async def websocket_application(scope, receive, send):
  while True:
    event = await receive()
 
    if event['type'] == 'websocket.connect':
      await send({
        'type': 'websocket.accept'
      })
    
    if event['type'] == 'websocket.disconnect':
      break
    
    if event['type'] == 'websocket.receive':
      if event['text'] == 'ping':
        await send({
          'type': 'websocket.send',
          'text': 'pong!'
        })

測試

現(xiàn)在,我們的ASGI應(yīng)用程序已設(shè)置為處理Websocket連接,并且我們已經(jīng)實(shí)現(xiàn)了Websocket服務(wù)器邏輯,讓我們對其進(jìn)行測試。 目前,Django開發(fā)服務(wù)器不使用asgi.py文件,因此您將無法使用./manage.py runserver測試連接。 相反,您需要使用ASGI服務(wù)器(例如uvicorn)運(yùn)行該應(yīng)用程序。 讓我們安裝它:

$ pip install uvicorn

安裝uvicorn后,我們可以使用以下命令運(yùn)行ASGI應(yīng)用程序:

$ uvicorn websocket_app.asgi:application
INFO:   Started server process [25557]
INFO:   Waiting for application startup.
INFO:   ASGI 'lifespan' protocol appears unsupported.
INFO:   Application startup complete.
INFO:   Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

要測試Websocket連接,請?jiān)谛逻x項(xiàng)卡中打開瀏覽器的開發(fā)工具。 在控制臺中,創(chuàng)建一個(gè)名為ws的新Websocket實(shí)例,該實(shí)例指向ws:// localhost:8000 /。 然后將onmessage處理程序附加到將event.data記錄到控制臺的ws。 最后,調(diào)用ws.send('ping')將消息發(fā)送到服務(wù)器。 您應(yīng)該看到值“ pong!”。 登錄到控制臺。

> ws = new WebSocket('ws://localhost:8000/')
 WebSocket {url: "ws://localhost:8000/", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …}
> ws.onmessage = event => console.log(event.data)
 event => console.log(event.data)
> ws.send("ping")
 undefined
 pong!

恭喜! 現(xiàn)在,您知道了如何使用ASGI將Websocket支持添加到Django應(yīng)用程序中。 去用它來制作很棒的東西。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中scatter散點(diǎn)圖及顏色整理大全

    Python中scatter散點(diǎn)圖及顏色整理大全

    python自帶的scatter函數(shù)參數(shù)中顏色和大小可以輸入列表進(jìn)行控制,即可以讓不同的點(diǎn)有不同的顏色和大小,下面這篇文章主要給大家介紹了關(guān)于Python中scatter散點(diǎn)圖及顏色整理大全的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Ubuntu中安裝指定Python版本方法詳解(理論上各版本通用)

    Ubuntu中安裝指定Python版本方法詳解(理論上各版本通用)

    現(xiàn)在基于linux的發(fā)行版本有很多,有centos,ubuntu等,一般基于linux的衍生系統(tǒng)至少都安裝了Python2版本,但是現(xiàn)在Python已經(jīng)是3.x版本大行其道了,這篇文章主要給大家介紹了關(guān)于Ubuntu中安裝指定Python版本方法的相關(guān)資料,理論上各版本通用,需要的朋友可以參考下
    2023-06-06
  • Scrapy?之中間件(Middleware)的具體使用

    Scrapy?之中間件(Middleware)的具體使用

    本文主要介紹了Scrapy?之中間件(Middleware)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python竟然能剪輯視頻

    Python竟然能剪輯視頻

    平時(shí)我們在刷短視頻或者看到一些視頻的時(shí)候,希望可以把視頻里面的音頻提取出來當(dāng)背景音樂究竟是怎么操作的呢,下面小編教大家python如何去提取一個(gè)視頻里面的音頻,感興趣的朋友一起看看吧
    2021-05-05
  • django 實(shí)現(xiàn)后臺從富文本提取純文本

    django 實(shí)現(xiàn)后臺從富文本提取純文本

    這篇文章主要介紹了django 實(shí)現(xiàn)后臺從富文本提取純文本,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python實(shí)現(xiàn)基于C/S架構(gòu)的聊天室功能詳解

    Python實(shí)現(xiàn)基于C/S架構(gòu)的聊天室功能詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)基于C/S架構(gòu)的聊天室功能,結(jié)合實(shí)例形式詳細(xì)分析了Python實(shí)現(xiàn)聊天室功能的客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • Python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及二叉樹定義與用法淺析

    Python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及二叉樹定義與用法淺析

    這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及二叉樹定義與用法,結(jié)合具體實(shí)例形式分析了Python數(shù)據(jù)結(jié)構(gòu)中棧、隊(duì)列及二叉樹的定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸

    TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸

    這篇文章主要介紹了TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python中for in的用法詳解

    python中for in的用法詳解

    這篇文章主要介紹了python中for in的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式

    PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式

    這篇文章主要介紹了PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

历史| 疏勒县| 赫章县| 筠连县| 礼泉县| 高要市| 喜德县| 微山县| 临高县| 任丘市| 项城市| 仁化县| 清新县| 建昌县| 疏勒县| 许昌市| 东丰县| 南陵县| 合川市| 新营市| 淮北市| 凤凰县| 陈巴尔虎旗| 六安市| 公安县| 四平市| 泰兴市| 肃宁县| 呼玛县| 盘山县| 惠水县| 恩施市| 朝阳县| 洛宁县| 镶黄旗| 达州市| 孟连| 郁南县| 浏阳市| 武威市| 洛阳市|