chaleaoch

chaleaoch 查看完整档案

大连编辑辽宁大学  |  电子信息科学与技术 编辑SbiBits  |  python开发工程师 编辑 chaleaoch.com 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

chaleaoch 提出了问题 · 5月22日

python中a=1是原子操作吗?

如何判断一个操作是原子操作?

PyDev console: starting.
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
import dis
dis.dis('a = 1')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (a)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE

关注 2 回答 1

chaleaoch 提出了问题 · 2月4日

django orm 抽象继承可以继承多个类吗?

比如

class A(Model):
    class Meta:
        abstract = True
class B(Model):
    class Meta:
        abstract = True
class C(A,B):
    pass

A,B 都是抽象model, 这样行吗?

另外, 多表继承可以这样写吗? 多重继承.

关注 1 回答 0

chaleaoch 提出了问题 · 2019-12-03

请教 rest api 如何设计+django rest_framework 如何实现?

  • Root

    • router1

      • category1

        • interface1

          • prefix1
          • prefix2
        • interface2

          • prefix21
      • category2
    • router2

      • category21

大概是这样一个结构. 其中 category 可忽略.

获取 router 信息
get */api/routers/

default_router.register(
    "api/routers", RouterViewset, base_name="RouterViewset"
)

获取 category summary 信息
get */api/routers/category_summary
在 RouterViewset 中定义

    @detail_route(methods=["get"])
    def category_summary(self, request, router_id):
        pass

获取某个 router 中的 interface 信息
是这么写吧?
get */api/routers/<router_id>/interfaces
这样实现

    @detail_route(methods=["get"])
    def interfaces(self, request, router_id):
        pass

还是这么写?
get */api/interfaces/?router-id=<id>

default_router.register(
    "api/interfaces", InterFaceViewset, base_name="InterFaceViewset"
)

以此类推 prefix 如何设计 api 同时如何用 drf 的 router 和 viewset 实现?
譬如
*/api/routers/<router_id>/interfaces/<interface_id>/prefixes
类似这样吗?

default_router.register(
    "routers/(?P<router_id>\d+)/interfaces/", InterFaceViewset, base_name="EmixInterFaceViewset"
)

    @detail_route(methods=["get"])
    def prefixes(self, request, router_id, interface_id):
        pass

上面的 url 岂不是被覆盖了?
因为:

 "routers/(?P<router_id>\d+)/interfaces/", InterFaceViewset, base_name="EmixInterFaceViewset"

get `*/api/routers/`

default_router.register(
    "api/routers", RouterViewset, base_name="RouterViewset"
)

之间有重复

关注 2 回答 0

chaleaoch 赞了回答 · 2019-11-27

解决关于python元类遇到冲突问题的问题(Metaclass conflict)?

针对这个代码解释错误信息:“B的metaclass必须是所有B的父类(这里只有test1)的metaclass的子类(但不一定要求是直接子类)”。

从字面上理解就可以找到解决办法:

class bMetaClass(ABCMeta, UpperAttrMetaclass):
    pass

b = bMetaClass('hehe', (test1,), {})()

关注 2 回答 1

chaleaoch 关注了专栏 · 2019-09-19

倚楼听风雨

学习、分享

关注 39

chaleaoch 提出了问题 · 2019-09-18

chrome和firefox对websocket的处理不一样,是chrome的问题还是firefox的问题?

问题描述

图片描述
图片描述

问题出现的环境背景及自己尝试过哪些方法

相关代码

前端代码

    var roomName = {{ room_name_json }};

    if (window.location.protocol == 'https:') {
        var chatSocket = new WebSocket('wss://' + window.location.host + '/ws/chat/' + roomName + '/');
    } else {
        var chatSocket = new WebSocket('ws://' + window.location.host + '/ws/chat/' + roomName + '/');
    }

    chatSocket.onmessage = function (e) {
        var data = JSON.parse(e.data);
        var message = data['message'];
        document.querySelector('#chat-log').value += (message + '\n');
    };

    chatSocket.onclose = function (e) {
        console.error('Chat socket closed unexpectedly');
    };

    $('#chat-message-submit').click(function () {
        $.get(window.location.origin + "/chat/test/" + roomName, function (data) {
            console.log(data);
        });
    });

后端代码

def test(request, room_name):
    import websocket
    import time
    import ssl
    from django.conf import settings
    is_https = getattr(settings, 'IS_HTTPS', False)
    ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
    if is_https:
        ws.connect("wss://127.0.0.1/ws/chat/{}/".format(room_name))
    else:
        ws.connect("ws://127.0.0.1/ws/chat/{}/".format(room_name))

    # time.sleep(6)
    ws.send(json.dumps("Hello, World1"))
    time.sleep(6)
    ws.send(json.dumps("Hello, World2"))
    time.sleep(6)
    ws.send(json.dumps("Hello, World3"))
    time.sleep(6)
    ws.close()
    return JsonResponse(666, safe=False)

你期待的结果是什么?实际看到的错误信息又是什么?

firefox的结果是对的.
chrome感觉像是在哪里堵住了并行变串行了.想知道如何处理这个问题?

关注 1 回答 0

chaleaoch 发布了文章 · 2019-09-09

十年老码农的昨天,今天,和明天

写下属于你的编程故事:标题不限,文体不限,语言不限,字数不限,自由发挥
以 “一起分享你的故事”为文章唯一标签,且在文章末尾注明:

  • 介绍一下自己(尺度自己掌握哦 - 几套房几辆车什么的就不用说出来扎小姐姐的心了)
    十年老码(准确的说11年了),画过电路板(烧坏好几个FPGA),干过嵌入式(打杂的),测过驱动(用应用程序),写过case(为后来的python开发打下不怎么坚实的基础), 目前在一家硬件设备生产厂商做"运维"开发.
  • 聊一聊你作为程序员遇到的有趣事儿/难过事儿/尴尬事儿/随便什么事儿~
  • 作为一个搞技术的优秀人才,是怎样提高自己的战斗力的呢?

    1. 看代码
      1.1 如果工作的项目代码质量一般,考虑看开源代码.
      1.2 框架源码和应用源码各有各的用处,不一定说非要看框架源码.甚至有时候,看应用的源码收货更大.
      1.3 自己造轮子,比阅读框架源码慢,但是有不一样的收获,最起码记得牢...
    2. 认真工作
      其实,就算每天敲业务,也是有收货的,关键还是你自己.
      譬如,我在给同事做code review的时候,就会发现一些我自己没做过的需求.
      很多公司的项目都挺坑的,我们可以锻炼自己的抗坑(kangkeng)能力.
    3. 如果到了后期(5-10年),可以关注某Q,等偏架构方向的领域,看看目前行业动态,但是不要盲目追求热点.
    4. 重视基础,越到后期基础越重要.
  • 有木有哪些经验可以送给即将踏入程序员大军的小宝贝们呀?

    • 趁年轻,好好学习,等岁数大了,记忆力就下降了,最重要的是,结婚了,四个老人一个孩子,都是牵扯精力的.
    • 相信时间的力量
      就是所谓的复利,如果把时间拉长, 时间的力量真的很吓人.
  • 如果还有一次选择职业的机会,你还会选程序员吗?为什么?
    会,因为我喜欢写代码
  • 嗯...你喜欢吃什么馅儿的月饼?
    五仁和什锦是我的最爱.
本文参与了 SegmentFault思否征文「一起分享你的故事」,欢迎正在阅读的你也加入,分享你的故事。
查看原文

赞 3 收藏 0 评论 1

chaleaoch 分享了头条 · 2019-08-03

很好的免费基础入门课程

赞 0 收藏 0 评论 0

chaleaoch 赞了问题 · 2019-08-03

解决django不使用外键怎么实现INNER JOIN

现在有两个数据表:

class Goods(models.Model):
    """商品表"""
    name = models.CharField('名称', max_length=50)
    num = models.IntegerField('数量', default=0)
    shop_id = models.IntegerField('店铺ID')

class Shop(models.Model):
    """店铺表"""
    name = models.CharField('店铺名称', max_length=50)
    reputation = models.SmallInteger('店铺信誉', default=1, help_text='范围:1~5')

查询商品的时候希望通过商品数量和店铺信誉进行联合排序,SQL是这样的:

SELECT
    goods.id,
    goods.num,
    shop.reputation
FROM
    goods
    INNER JOIN shop
        ON goods.shop_id = shop.id
ORDER BY
    goods.num DESC,
    shop.reputation DESC

这两张表只进行了逻辑关联,没有建立外键。上面的SQL查询怎么通过django ORM实现?

关注 2 回答 2

chaleaoch 赞了回答 · 2019-07-23

解决python3.6 中__init__.py对于一个包来说是否是必须的?

如果不添加__init__ python不会将其视作包,这个是包的初始化入口,当你第一次import该包时,会运行__init__。该包的__file__属性会指向__init__所在路径。

你这里说的没有__init__的是python3的新feature:命名空间包。这么写在python2中是报错的。

print(subdir2.__path__)
print(subdir2.__path__)

你可以看看区别。

Regular packages will continue to have an __init__.py and will reside in a single directory.

Namespace packages cannot contain an __init__.py. As a consequence, pkgutil.extend_path and pkg_resources.declare_namespace become obsolete for purposes of namespace package creation. There will be no marker file or directory for specifying a namespace package.

During import processing, the import machinery will continue to iterate over each directory in the parent path as it does in Python 3.2. While looking for a module or package named "foo", for each directory in the parent path:

If <directory>/foo/__init__.py is found, a regular package is imported and returned.
If not, but <directory>/foo.{py,pyc,so,pyd} is found, a module is imported and returned. The exact list of extension varies by platform and whether the -O flag is specified. The list here is representative.
If not, but <directory>/foo is found and is a directory, it is recorded and the scan continues with the next directory in the parent path.
Otherwise the scan continues with the next directory in the parent path.
If the scan completes without returning a module or package, and at least one directory was recorded, then a namespace package is created. The new namespace package:

Has a __path__ attribute set to an iterable of the path strings that were found and recorded during the scan.
Does not have a __file__ attribute.
Note that if "import foo" is executed and "foo" is found as a namespace package (using the above rules), then "foo" is immediately created as a package. The creation of the namespace package is not deferred until a sub-level import occurs.

A namespace package is not fundamentally different from a regular package. It is just a different way of creating packages. Once a namespace package is created, there is no functional difference between it and a regular package.

关注 5 回答 5

认证与成就

  • 获得 21 次点赞
  • 获得 23 枚徽章 获得 0 枚金徽章, 获得 6 枚银徽章, 获得 17 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-10-24
个人主页被 675 人浏览