问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django源码怎么看(Django源码)

发布网友 发布时间:2024-10-08 22:42

我来回答

1个回答

热心网友 时间:2024-10-31 01:17

导读:本篇文章首席CTO笔记来给大家介绍有关django源码怎么看的相关内容,希望对大家有所帮助,一起来看看吧。

django视图中怎么把从前端获取的user作为全局变量

有时候,我们需要Templates模板页面可以使用一些变量。这些变量我们在views.py响应时没有返回设置的变量。例如,如下代码:

#coding:utf-8

from?django.shortcuts?import?render

def?index(request):

context?=?{}

context['title']?=?'测试标题'

return?render(request,?'index.html',?context)

上面是某个views.py的方法之一。它将渲染index.html模版(Template)页面,并返回context字典。该字典是传入变量信息给前端页面。对应的index.html如下:

?

html

head/head

body

h3{{title}}/h3

p是否登录:{{request.user.is_authenticated}}/p

/body

/html

响应结果除了有title变量值之外,还有是否登录信息。该登录信息来自request变量,问题是上面views.py中返回结果的context中没有写入request变量。而模版也没却有可以获取该变量。

这个当时不是无中生有,我一步一步剖析给大家看。原理讲明白之后,就自然懂得如何设置模版(Templates)的全局变量或者叫默认变量。

render方法是render_to_response方法的简写方式。上面的views.py代码相当于如下:

?

#coding:utf-8

from?django.shortcuts?import?render_to_response

from?django.template?import?RequestContext

def?index(request):

context?=?{}

context['title']?=?'测试标题'

return?render_to_response('index.html',?context,?RequestContext(request))

如果去掉render_to_response的第三个参数,即RequestContext(request)部分。

渲染index.html模版页面就无法得到{{request.user.is_authenticated}}的值,即没有传递request变量给前端页面。很明显RequestContext很关键。

有关RequestContext的内容可以从Django官方文档查得。

该类实例化时会解析settings中的Templates设置中的context_processors配置。新建Django项目settings.py文件中默认的Templates设置如下:

?

TEMPLATES?=?[

{

'BACKEND':?'django.template.backends.django.DjangoTemplates',

'DIRS':?[],

'APP_DIRS':?True,

'OPTIONS':?{

'context_processors':?[

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

],

},

},

]

大家可发现context_processors有一系列设置,其中根据django.template.context_processors.request的路径找到Django的相关源码。

Django安装在Python的安装目录下Lib/site-packages/目录中,找到django/template/context_processors.py文件,打开可看到request方法:

?

def?request(request):

return?{'request':?request}

该方法返回一个字典,key为request,value为request对象。很明显,render中的request对象就是通过加载settings中的context_processors列表方法得到字典项。

我们也可以采用这种方法,给Django项目设置全局的模版变量。例如,我的Django名称为myproject,在myproject/myproject目录中创建一个contexts.py文件,代码如下:

?

#coding:utf-8

from?django.conf?import?settings

#?得到语言设置

def?lang(request):

return?{'lang':?settings.LANGUAGE_CODE}

该文件的方法需要request参数,最后需要返回一个字典即可。

再打开settings.py文件,在Templates中添加刚才写的方法引用:

?

TEMPLATES?=?[

{

'BACKEND':?'django.template.backends.django.DjangoTemplates',

'DIRS':?[],

'APP_DIRS':?True,

'OPTIONS':?{

'context_processors':?[

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

#?自定义模版全局变量(默认变量)

'myproject.contexts.lang',

],

},

},

]

添加模版全局变量之后,我们可以在任意位置渲染模版页面无需再手动写相关代码即可使用该变量。

django/python快速开发体现在什么地方?有多快捷呢?

django是符合mvc模式的,不过在django里面叫mtv,即模型,模板,视图,django的哲学,目前我的理解是,简单,简洁,还有耦合,我用它写过一个博客,体会最大的是他本身的通用视图给了很大的帮助,代码少了很多,django内置的组件,比如comments,评论,用起来就很简单,自己不必再写代码,django是开源的,多国家,多语言应该很容易实现,你可以自己看看djangobook,一本免费的介绍django的官方文档,很好理解的,里面应该会有你想要的东西

如何查看已安装的python库的源码

如果不出意外,windows中,源码应该在Python\Lib\site-packages\wordcloud文件夹里。

当然,这不是绝对的,和你的安装方式有关。

PS:安利一个学习Python的免费网站:刘江的Python和Django教程,^-^。

Django源码阅读(一)项目的生成与启动

诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,python能有更多更丰富的成熟方案,且不再被诟病性能和可维护性。(屁话结束)

取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。

django-adminstartprojectHelloWorld即可生成django项目,命令行是exe格式的。

manage.py把参数交给命令行解析。

execute_from_command_line()通过命令行参数,创建一个管理类。然后运行他的execute()。

如果设置了reload,将会在启动前先check_errors。

check_errors()是个闭包,所以上文结尾是(django.setup)()。

直接看最后一句settings.INSTALLED_APPS。从settings中抓取app

注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于django\conf\__init__.py

这是个Settings类的懒加载封装类,直到__getattr__取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的__dict__上(下次会直接在自己身上找到,因为__getattr__优先级较低)

为了方便debug,我们直接写个run.py。不用命令行的方式。

项目下建个run.py,模拟runserver命令

debug抓一下setting_module

回到setup()中的最后一句apps.populate(settings.INSTALLED_APPS)

开始看apps.populate()

首先看这段

这些App最后都会封装成为AppConfig。且会装载到self.app_configs字典中

随后,分别调用每个appConfig的import_models()和ready()方法。

App的装载部分大体如此

为了方便debug我们改写下最后一句

res的类型是Commanddjango.contrib.staticfiles.management.commands.runserver.Commandobjectat0x00000101ED5163A0

重点是第二句,让我们跳到run_from_argv()方法,这里对参数进行了若干处理。

用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。

这里分为两种情况,如果是reload重载时,会直接执行inner_run(),而项目启动需要先执行其他逻辑。

django项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。

第一次启动时,DJANGO_AUTORELOAD_ENV为None,无法进入启动逻辑。会进入restart_with_reloader()。

在这里会将DJANGO_AUTORELOAD_ENV置为True,随后重启。

第二次时,可以进入启动逻辑了。

这里创建了一个django主线程,将inner_run()传入。

随后本线程通过reloader.run(django_main_thread),创建一个轮询守护进程。

我们接下来看django的主线程inner_run()。

当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了

这相当于我们之前在fastapi中说到的,将fastapi的app交由asgi服务器。(asgi也是django提出来的,两者本质同源)

那么这个wsgi是从哪来的?让我们来稍微回溯下

这个settings是一个对象,在之前的操作中已经从settings.py配置文件中获得了自身的属性。所以我们只需要去settings.py配置文件中寻找。

我们来寻找这个get_wsgi_application()。

它会再次调用setup(),重要的是,返回一个WSGIHandler类的实例。

这就是wsgiapp本身。

load_middleware()为构建中间件堆栈,这也是wsgiapp获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。

如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。

app入口→中间件堆栈→路由→路由节点→endpoint

所以,wsgiapp就此构建完毕,服务器传入请求至app入口,即可经过中间件到达路由进行分发。

python用from...import...导入模块,用help()方法查询文档出错,这是为何?

你从这里应该是看不了,错误提示是说Django的环境配置有些问题,我自己试验了一下,你应该进入的python,然后如你那样操作查看,也报了你这同样的错。我有两个推荐解决方法:

通过一个Django项目,然后利用pythonmanage.pyshell进入python交互环境,再做你这个操作,来查看models。

通过编辑器:

①找到Django源码,去查看

②或者在项目中链接到models去看。

结语:以上就是首席CTO笔记为大家介绍的关于django源码怎么看的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
妇科的止血药有哪些 妇科用的止血药有哪些 妇科止血药的功效 人艰不拆是啥意思 汉酱51 度酱香型白酒多少钱?味道怎么样? 穿凉鞋可以穿袜子吗?凉鞋发黄怎么变白? 爱奇艺vip投屏限制怎么办 爱奇艺vip投屏视频限制怎么解决 支付宝怎样解除关联的支付宝账号? 剑圣叫什么名字 ...政策?这个政策的目的是什么?会对经济有什么影响? 酸黄瓜汤的做法大全 土建预算员土建预算员证书颁发 为什么我在我家附近马路上看不到一个摄像头。。除了小区周边有红外线防... STANLEY博士的家这个游戏怎么玩 求'Stanley博士的家'智力游戏的攻略!!! 终极一班4会员更新到第几集了 为什么终极一班4更新到23集就不更新了,都过了好几天了,不是说无休模 ... 终极一班3怎么才更新到15,16呢? 7月8日终极一班4为什么没更新 爱失去过还可以再重来吗 逝去的爱是否还可以重来? 曾经失去过的爱情还可以重来吗? 当一个人失去了爱情还可以从来吗? 液力透平结构 布鲁斯·鲍文个人数据 鲍文简介 鲍文退役了吗? 布鲁斯·鲍文简介 布鲁斯-鲍文年龄多少 鲍文个人荣誉 这双鞋Nike正品原价实体店购买869人民币,不喜欢了,在淘宝二手上想卖了... 耐克阿迪达斯专卖店的那些过期了的旧款衣服鞋子怎么处理了? 淘宝买了双代购的耐克鞋,原价609买了388,鞋的整体做工质量还不错,大... 高铁上有随车安全员吗? 李辅国赌唐代宗赌对了吗 怎么写请假条最有说服力呢? 家长请假条范文 做梦很乱什么原因 最近经常做梦是怎么回事 stxihei-gbpc-euc-h是什么字体! 黄栀子有什么药用功效 晚上睡觉容易做梦是怎么回事 唐山茉莉新城带装修吗? vivox6分屏怎么变横屏 茉莉新城周边环境怎么样?生活便利吗? 福州恒荣广场营销中心电话是多少? 唐山茉莉新城在哪里? vivox6分屏多任务怎么把它弄成横屏啊,一有消息就竖屏了,感觉更不方便... 唐山茉莉新城地址在哪里? 一睡觉就乱七八糟的做很多梦怎么回事