发布网友 发布时间: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源码怎么看的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。