前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django Blueprint

Django Blueprint

原创
作者头像
vanguard
修改2021-01-06 15:04:38
6600
修改2021-01-06 15:04:38
举报
文章被收录于专栏:vanguardvanguard

Runtime and Source Code brief analysis

Django+DRF runtime call graph use pygraphviz + breakpoint - Detail link

Django Call Graph
Django Call Graph

Source code https://github.com/django/django

代码语言:python
复制
#!/usr/bin/env python
import os, pygraphviz as pyg

COMA = ','
PERIOD = '.'

def _is_none(x):
    if x is None: return True
    if x == []: return True
    if x == ' ': return True

def _is_exclude(path):
    if path == '__pycache__': return True

def _exclude_path(path):
    if _is_exclude(path): return True
    if 'locale' in path: return True

def _not_pyhtml(name):
    # if name[-3:]=='.py' or name[-5:]=='.html': return False
    if name[-3:]=='.py': return False
    return True

def _comb(a,b): return a+PERIOD+b

class CodeGraph:

    def __init__(self, root_path='./'):
        self.root = root_path
        self.pfiles = [] # parent.path, file_name
        self.pdirectorys = [] # parent.path, directory
        self.loop_all()
        self.draw_graph()

    def loop_all(self):
        for path, dirs, files in os.walk(self.root):
            if _is_none(path): continue
            if _exclude_path(path): continue
            path = path.replace('./','django.').replace('\\',PERIOD).replace('/',PERIOD).replace(' ','')
            [self._record_file(path,file) for file in files]
            [self._record_dirs(path,directory) for directory in dirs]
        print('prepared >> .py %d folders %d total %d' % (len(self.pfiles),len(self.pdirectorys),len(self.pfiles+self.pdirectorys)))
        # [print(f) for f in self.pdirectorys]
        # [print(f) for f in self.pfiles]

    def draw_graph(self):
        data = self.pfiles + self.pdirectorys
        nodes, edges = [], []
        graph_obj = pyg.AGraph(directed=False, strict=False, ranksep=0.1, splines="spline", concentrate=True)
        for line in data: # .encode(encoding="utf-8")
            [a,b] = line.split(COMA)
            if PERIOD in b: c = b.split(PERIOD)[-2]
            else: c = b
            if not a in nodes: nodes.append(a); graph_obj.add_node(a, label=a,color="#ffffff", fontname="times bold italic")
            if not b in nodes: nodes.append(b); graph_obj.add_node(b, label=c,color="#ffffff", fontname="times bold italic")
            if not [a,b] in edges: edges.append([a,b]); graph_obj.add_edge(a,b)
        print('Start darwing...')
        graph_obj.layout(prog='fdp')
        graph_obj.draw('django_graph.png')
        print('Done')

    def _record_file(self,path,file):
        if _is_none(file): return
        if _is_exclude(file): return
        if _not_pyhtml(file): return
        if path[-1] == PERIOD: path = path[:-1]
        line = path+COMA+_comb(path,file)
        if line in self.pfiles: return
        self.pfiles.append(line)

    def _record_dirs(self,path,folder):
        if _is_none(folder): return
        if _is_exclude(folder): return
        if path[-1] == PERIOD: path = path[:-1]
        line = path+COMA+_comb(path,folder)
        if line in self.pdirectorys: return
        self.pdirectorys.append(line)

if __name__=='__main__': CodeGraph()

django_graph.png

Django Source Code Brief Graph A
Django Source Code Brief Graph A
Django Source Code Brief Graph B
Django Source Code Brief Graph B
Django Source Code Brief Graph C
Django Source Code Brief Graph C

Django 3.2源码,.py文件-706,文件夹-182,总共888个节点

命名】Django 的名字来源于 Django Reinhardt,一个活跃在1930 年到 1950 年代初期的吉普赛吉他工作室,直到今天,他们依然被认为是史上最好的吉他手之一。

聆听他的音乐. 你会喜欢它的.

Django 发音为 JANG,使用 FANG 来押韵,字母 "D "是不发声的.

我们也记录了一段 发音的音频片段.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档