self.scope ['user'] в Django каналах продолжает появляться как AnonymousUser - PullRequest
0 голосов
/ 07 апреля 2020

Когда я вхожу в мой интерфейс, мой вызов self.scope ['user'] в моем файле friends.consumer.py в django каналах возвращает AnonymousUser, но при входе в систему и вызове self.scope ['user'] в мой chat.consumer.py отображается как зарегистрированный пользователь. По какой-то причине область действия ['user'] в одном из моих приложений работает, а в другом - нет. Я не понимаю в чем проблема. В моем проекте django настроена маршрутизация:

routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import chat.routing
import friends.routing

application = ProtocolTypeRouter ({
    'websocket': AuthMiddlewareStack(
        URLRouter(
        friends.routing.websocket_urlpatterns + chat.routing.websocket_urlpatterns
        )
    )
})

. Я структурирую свой второй customer.py аналогично моему первому consumer.py. Это мой customer.py, где работает область ['user'] (мне не нужно было область действия ['user'] у первого потребителя, но я просто хотел проверить, работает ли она

chat .consumer.py

class ChatConsumer(WebsocketConsumer):
  ...
   def connect(self):
    print(self.scope['user'])
    self.room_name = self.scope['url_route']['kwargs']['room_name']
    self.room_group_name = 'chat_%s' % self.room_name

    # Join room group
    async_to_sync (self.channel_layer.group_add)(
        self.room_group_name,
        self.channel_name
    )

    self.accept()

Этот код является потребителем, где моя область ['user'] отображается как анонимный пользователь даже после того, как я вошел в систему.

friends.consumers.py

class FriendRequestConsumer(JsonWebsocketConsumer):
    def connect(self):
        user = self.scope['user']
        grp = 'notifications_{}'.format(user.username)
        self.accept()
        async_to_sync(self.channel_layer.group_add(grp, self.channel_name))

Вот также мой routing.py для каждого приложения

friends.routing.py

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'^ws/friend-request-notification/$', consumers.FriendRequestConsumer),
]

chat.routing.py

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer),
]

Мне удалось подключиться к веб-сокету для них обоих в моем reactjs интерфейсе. Я знаю, что AuthMiddlewareStack позволяет нам вытянуть область действия ['user'], я просто не понимаю, почему один работает, а другой - Может ли быть, что я не подключился к веб-сокету должным образом во внешнем интерфейсе, или я что-то упустил на одном из моих потребителей? Я благодарен за помощь и заранее благодарен.

За подключение к веб-сокету в моем js, я сделал чат. js файл и уведомления. js

чат. js

class Chat extends React.Component{
  ... 
   initialiseChat() {
this.waitForSocketConnection(()=> {
  WebSocketInstance.fetchMessages(
    this.props.username,
    this.props.match.params.id
   )
  })
WebSocketInstance.connect(this.props.match.params.id)
}
constructor(props){
  super(props)
  this.initialiseChat()
}

уведомления. js

class Notifications extends React.Component{
   ...
  initialiseNotification(){
  this.waitForSocketConnection(() => {
    NotificationWebSocketInstance.fetchFriendRequests(
     this.props.id
  )
  })
  NotificationWebSocketInstance.connect()
}

constructor(props){
  super(props)
  this.initialiseNotification()
}

Вот мои действия с websocket:

webosocket. js (эта функция подключения вызывается в чате. js)

class WebSocketService {
  ...
  connect(chatUrl) {
const path ='ws://127.0.0.1:8000/ws/chat/'+chatUrl+'/';
console.log(path)
this.socketRef = new WebSocket(path)
this.socketRef.onopen = () => {
  console.log('websocket open')

}
...
const WebSocketInstance = WebSocketService.getInstance();
export default WebSocketInstance;

Вот веб-розетка для уведомления. js

messagesWebsocket. js

class WebSocketNotifications {
 ...
 connect(){
 const path = 'ws://127.0.0.1:8000/ws/friend-request-notification/'
 console.log(path)
 this.socketRef = new WebSocket(path)
 this.socketRef.onopen = () =>{
   console.log('websocket open')
 }
 ...
 const NotificationWebSocketInstance = 
  WebSocketNotifications.getInstance();

 export default NotificationWebSocketInstance;

А вот и маршруты. js

class BaseRouter extends React.Component {
  <Route exact path = '/chat/:id' render={(props) => <Chat {...props} 
      {...this.props} isAuthenticated={this.props.isAuthenticated} />}  
      />
    <Route exact path = '/notifications/' render={(props) => 
       <Notifications {...props} {...this.props} isAuthenticated= 
       {this.props.isAuthenticated} />}  />

1 Ответ

0 голосов
/ 29 апреля 2020

Должны быть некоторые проблемы с вашим промежуточным программным обеспечением токена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...