博主之前学从Java后端开发,后面获取到读研资格,想着未来转算法岗,初学Python,发现Python还挺有趣的,由于之前所学后端缘故,有点后端情节,想学习一下Django框架(python的web框架),技多不压身,开学!
一、下载Django环境
使用Django进行开发基本就需要三件套,Python、Django和Pymysql。本人采用的开发环境如下:
环境 | 版本号 |
Python | 3.12 |
Django | 5.0.3 |
Pymysql | 1.1.0 |
上面这一套环境是本人学习Django的使用环境,基本使用上没有出现版本不适配的问题,基本可以放心学习使用。有的人使用pip,有的人使用anaconda,两种方式安装环境的方式不一样,大家可以自行选择。不过能说明的就是,无论哪种方式安装环境,都是能正常使用Django开发的。
二、构建Django项目
我这里使用的是Pycharm专业版,记住一定是要专业版,社区版是不能用作web开发的,会有限制的,大家可以去学校认证或者破解。
新建一个Project,选择Django,选择好环境,我这里使用的是anaconda虚拟环境,基本按照下面这张图的说明就能正常创建一个自己定义的Django文件。
新建好的Django文件夹,基本只有这几个文件,由于初学,我对这几个文件暂时不是很熟悉,后续学习继续补充。
最后在右上角启动Django,对了,Django有一个特性,也就是热部署,每一次完成代码的更新,不需要重启Django,只需要ctrl+s保存代码,就会自动更新。
三、Django中接口与Url配对
进入urls.py 文件,这个文件就是接口函数与url配对的设置文件。
这里的接口函数就是类似与java中的每一个controller里面的接口函数,也可以解释为访问url之后进入到的函数。
例如,我这里写了一个接口函数,名字为hello_index,在 urlpatterns 中配置好这个接口函数的访问路径,也就是path()的第一个参数,由于我这里是空路径,也就是访问默认路径就会触发这个接口函数,这个接口函数的内容是返回”主页“这个字符串。访问效果可以看下图。
也许讲到这里,大家会有一些儿懵,我再解释一下我自己的理解。
接口函数:也就是一个def函数,它里面的参数默认带一个request对象,这个对象包括请求体的所有信息,包括请求头,参数等等;
urlpatterns:这个就是一个url与接口函数映射的变量,类型是一个列表,在这个变量里面使用path函数来定义映射;
path函数:path函数第一个参数是配对url,第二个是接口函数(也就是你想配对哪个接口函数),第三个就是name,也就是给这个配对起一个名字(后续我可以根据配对的名字,反向找到这个请求url与接口函数)
四、Django的多模块与Url配置
在Django的项目中,基本都会遇到分模块开发的状态,例如一个模块只负责图书相关的业务,一个模块只负责电影相关的业务,等等。Django提供了新建模块的命令,命令如下:
python manage.py startapp xxx (xxx为业务名称)例如:
python manage.py startapp test1
敲完命令之后,目录下面就会多一个文件夹,我这里是test1,那么目录下面就会多一个test1文件夹。
那么,问题又来了,我们前面说,如果是写接口函数以及Url的配置,我们都是在最开始的默认主文件夹下的urls.py下编写和配置的,那么随着模型数目的增大,全部都写在一个文件里面,就会导致难以观看和管理,也不方便更改。当然,这个也是有解决方法的,那么就是book模块相关的url和接口函数只写在book模块里,movie模型相关的也只写在movie模块里,最后只需要在默认的urls.py文件里面配置一下就行,这样子达到了解耦的效果。
首先,在自身模块中,我们在views文件中,写接口函数。
然后创建一个urls.py文件,大致写法可以参照默认的urls.py文件(其实基本就是自己手写写一个urlpattrens列表变量)。
基本都可以参照默认的urls文件书写。
最后一步,就是在默认的urls文件中配置本模块的urls文件。使用path函数,然后标记这个模块的路径,例如这里是movie,也就是说以后访问movie模块所有接口函数,都需要前面加一个/movie/路径区分。
五、一些细节的解释
首先是两种请求路径的说明,可以参照下面的说明:
方式一:http://127.0.0.1:8000/movie/detail/123方式二:http://127.0.0.1:8000/movie/detail?movie_id=123
之前有过后端经验的人也许会明白,不过我这里再次解释一下。第一种方式只用过路径url的方式传递参数,而第二种则是将参数保存在请求头里面,后续需要从request请求体里面获取。 相信看了下面的接口函数,大家就可以明白两种的区别。
然后就是也许很多小伙伴,会发现,urls文件中会多定义了一个变量app_name,这个变量是命名空间,可以理解会区分不同模块的一个标志。
因为在讲解path函数的时候,我们讲到过第三个参数,也就是name参数,这个参数是为这一次url与接口函数的匹配取的一个名字,但是在偌大的项目中,随着模块数的增多,后面经常会遇到name相重复的情况,所以这个时候引入模块命名空间,用于区分不同模块,即使后面配对名称相同,有不同的命名空间,所以就不会担心重名问题。