Python 根据字符串调用函数或取到/修改类属性 以及 Django websocket的几种实现方式以及apache websocket配置

142 阅读2分钟

这是我参与2022首次更文挑战的第27天,活动详情查看2022首次更文挑战

今天来讲一讲一个比较基础的知识点,众所周知,python中一切皆对象, 不管是类也好,方法也好,都可以当作对象来看,任何对象都可以使用obj.attribute调用属性或者方法,

1.使用 getattr(object, name, default=None) 获取属性

# -*- encoding=utf-8 -*-

class Test:

  def __init__(self):
    self.name = '莉莉'
    self.age = 18

  def get_name(self):
    print('年龄是:{}'.format(self.name))
    return self.name

if __name__ == '__main__':

  test = Test()
  name = getattr(test, 'name') # 获取属性
  print(name)
  age = getattr(test, 'age') # 获取属性
  print(age)
  none = getattr(test, 'none', 'none') # 获取不存在的属性,需要添加 default,否则抛异常
  print(none)
  new_get_name = getattr(test, 'get_name') # 获取方法
  print(new_get_name)
  new_get_name() # 调用方法
  test.__dict__["name"] = "杰克" # 通过字符串修改类属性
  print(test.name)

 

运行

莉莉

18

none

<bound method Test.get_name of <__main__.Test object at 0x10d87d340>>

年龄是:莉莉

杰克

2.使用__dict__获取属性

# -*- encoding=utf-8 -*-

class Test:
  def __init__(self):
    self.name = '莉莉'
    self.age = 18
    
if __name__ == '__main__':
  test = Test()
  name = test.__dict__['name']
  print(name)

运行:

莉莉

ps: 如果使用getattr()遇到类属性和方法名是相同时,默认取属性

通过字符串访问类对象类方法修改类对象

dwebsocket

如果使用dwebsockt 可以较为简单快速的使用websocket 问题是需要降django版本(django3.0以下),django3.0不支持使用dwebsocket

websocket

如果想在django3上使用websocket 需要使用官方推荐的channels,同时需要弃用wsgi 使用ASGI应用程序结构,需要重新处理部署流程。

注意:Uvicorn在新版本后[>= 0.12]有关,不会自动提供websocket实现

配置1

配置2

apache websocket 配置

http.conf文件需要将

LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so 前面的#去掉。

同时如果在apache下使用channels 需要单独运行daphne

websocket 基础配置

websocket需要iis8+windows server2012以上,

服务器:apache v2.2

iis 8.0 windows 8 /windows server2012

nginx v1.3

node.js all

浏览器:chrome4.0 safari5.0.0

ie10