当前位置:   article > 正文

FastAPI 学习之路(四十五)WebSockets(二)

FastAPI 学习之路(四十五)WebSockets(二)

上一节,我们分享了WebSockets入门的使用方法,本节,我们在原来的基础上,进行深入的演示。上一节最后我们提到了依赖token或者cookie等。首先我们对上次的代码进行调整。在 FastApi学习之路(三十八)Static Files,我们提到了静态文件的使用,我们按照之前的方法,将上一节中的静态代码抽离出来。

 放在了templates下面的webchat.html。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Chat</title>
  5. </head>
  6. <body>
  7. <h1>WebSocket 聊天</h1>
  8. <form action="" onsubmit="sendMessage(event)">
  9. <input type="text" id="messageText" autocomplete="off"/>
  10. <button>Send</button>
  11. </form>
  12. <ul id='messages'>
  13. </ul>
  14. <script>
  15. var ws = new WebSocket("ws://localhost:8000/ws");
  16. ws.onmessage = function(event) {
  17. var messages = document.getElementById('messages')
  18. var message = document.createElement('li')
  19. var content = document.createTextNode(event.data)
  20. message.appendChild(content)
  21. messages.appendChild(message)
  22. };
  23. function sendMessage(event) {
  24. var input = document.getElementById("messageText")
  25. ws.send(input.value)
  26. input.value = ''
  27. event.preventDefault()
  28. }
  29. </script>
  30. </body>
  31. </html>

main里面的代码调整为:

  1. """
  2. -*- encoding=utf-8 -*-
  3. Time: 2024/7/12 09:41
  4. Author: lc
  5. Email: 15101006331@163.com
  6. File: main.py
  7. """
  8. from typing import Optional
  9. from fastapi import Cookie, Depends, FastAPI, Request, Query, WebSocket, status
  10. from fastapi.templating import Jinja2Templates
  11. app = FastAPI()
  12. templates = Jinja2Templates(directory="./templates")
  13. @app.get("/")
  14. async def home(request: Request):
  15. return templates.TemplateResponse(
  16. "webchat.html",
  17. {
  18. "request": request
  19. }
  20. )
  21. async def get_cookie_or_token(
  22. websocket: WebSocket,
  23. session: Optional[str] = Cookie(None),
  24. token: Optional[str] = Query(None),
  25. ):
  26. if session is None and token is None:
  27. await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
  28. return session or token
  29. @app.websocket("item/ws")
  30. async def websocket_endpoint(
  31. websocket: WebSocket,
  32. cookie_or_token: str = Depends(get_cookie_or_token),
  33. ):
  34. await websocket.accept()
  35. while True:
  36. data = await websocket.receive_text()
  37. await websocket.send_text(f"Message is: {data}")

但是我们之前的html代码去调试的时候,发现报错,因为我们需要依靠session或者token。那么我们需要对html进行调整。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Chat</title>
  5. </head>
  6. <body>
  7. <h1>WebSocket Chat</h1>
  8. <form action="" onsubmit="sendMessage(event)">
  9. <label>Token: <input type="text" id="token" autocomplete="off" value="some-key-token"/></label>
  10. <button onclick="connect(event)">链接</button>
  11. <hr>
  12. <label>消息: <input type="text" id="messageText" autocomplete="off"/></label>
  13. <button>发送</button>
  14. </form>
  15. <ul id='messages'>
  16. </ul>
  17. <script>
  18. var ws = null;
  19. function connect(event) {
  20. var token = document.getElementById("token")
  21. ws = new WebSocket("ws://localhost:8000/items/ws?token=" + token.value);
  22. ws.onmessage = function(event) {
  23. var messages = document.getElementById('messages')
  24. var message = document.createElement('li')
  25. var content = document.createTextNode(event.data)
  26. message.appendChild(content)
  27. messages.appendChild(message)
  28. };
  29. event.preventDefault()
  30. }
  31. function sendMessage(event) {
  32. var input = document.getElementById("messageText")
  33. ws.send(input.value)
  34. input.value = ''
  35. event.preventDefault()
  36. }
  37. </script>
  38. </body>
  39. </html>

其实我们就是增加了带了token。

但是当我们直接点发送时无法发送消息,只有我们先点击链接按钮增加了token之后就可以发送成功了。

这样我们的WebSockets就可以带token来做登录了,但是我们的token呢,只是做了简单的校验。那么我们是不是可以和登录退出放在一起呢。肯定是可以的,我们在下次分享的时候将登录退出分享出来

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/819929
推荐阅读
相关标签
  

闽ICP备14008679号