
1.2.3 调试框架源码
对于Django框架的核心模块的源码调试,比如视图层、模板层等,同样需要基于Django框架创建一个简单的Web项目。下面通过一个简单的示例,简单介绍如何调试Django源码,对于其中使用的一些Django基本操作则不再赘述。与1.2.2节一样,需要先安装Django模块,再安装mysqlclient模块。
为了简单起见,继续使用first_django项目作为调试对象。使用VSCode导入该项目,由Django生成的项目文件如图1-10所示。为了让该项目能运行起来,需要修改first_django目录下的settings.py文件,将默认的数据库引擎(SQLite3)调整成MySQL,并添加数据库的地址、端口、账号和密码。
注意,在启动first_django项目之前,一定要先创建该项目使用的数据库(在这里配置的是django_book),否则会报错。
在VSCode中,单击Terminal菜单栏下的New Terminal命令,在控制台上执行如下命令:

打开浏览器,输入localhost:8888,可以看到如图1-15所示页面,说明创建的first_django项目启动成功。

图1-15
说明:在Django 2.2的早些版本中,在访问Django项目首页时会出现DisallowedHost异常页面,此时修改settings.py文件中的ALLOWED_HOSTS值即可,表示允许列表中的IP地址访问该Web服务。如果完全对外开放,则设置ALLOWED_HOSTS=['*']。
接下来,给该项目添加一个/echo/接口,这个接口可以从请求中获取value参数的值,然后回显在页面上。开发/echo/接口的方法非常简单,只需两个步骤:
(1)添加一个视图函数echo()用来处理/echo/接口。
(2)添加一行URLConf配置,将/echo/接口映射到视图函数echo()上进行处理。
在first_django目录下添加一个views.py文件,内容如下:

在first_django目录下的urls.py文件中添加相应的URLConf配置:

重启first_django项目,打开浏览器,输入localhost:8888/echo/?value=test_echo,结果如图1-16所示。

图1-16
为了能调试该项目中的代码,需要先定位到VSCode的侧边栏,单击Run图标下的create a launch.json file选项,在弹出的窗口中单击Django launch and debug a Django web application选项,如图1-17所示。如果没有该选项,则需要在VSCode中安装Django揑件。

图1-17
此时VSCode会生成launch.json文件。通过前文对launch.json文件中相关参数的介绍,不难理解下面的配置内容:

通常为了修改启动端口,或者允许仸意的IP地址访问,可以在args字段中加上相关参数:


这样就和前文在控制台中启动服务的设置相同了。在完成这个简单的例子后,思考以下问题:
◎ 请求是如何找到对应的视图函数或者视图类去处理的?
◎ 视图函数中的第1个参数request是从哪里来的?为什么一定要放在第1个参数位置上?
有了问题就可以去源码中打上断点并进行调试了。这一步骤会在后续的Django源码分析中经常用到,即从现象入手去追踪源码,并在追踪过程中不断加深对Django源码的理解。