关于《 Python 编程:从入门到实践》中的一个技术问题~

2018-08-30 11:54:53 +08:00
 KinneyZhang
有大佬研究过这本书的吗?
我的问题是在 django 那一块,在创建网页,定义 url 的时候,为什么要在 learning_log(包含 settings,urls,wsgi )和 learning_logs(具体 app 文件夹,包括 model,test,view,以及 html 等)两个文件夹里都创建 urls.py 呢?书上的意思是,前者的 url 定义了网站的所有 url,后者定义了具体视图的 url。
由于我的 django 比较新,没有用 url(.....)来定义,而是采用了 path(.......), 通过 google,后者定义具体视图 urls 解决了,换成了 path,但是前者要怎么写呢?书上原来的是 url(r'', include('learning_logs.urls', namespace='learning_logs')),我需要换成 path 的写法?
还有就是前面的疑问,为什么要定义两个 urls.py,直接在前者里面定义试图 url 不就可以了嘛?
--------------------
哎,描述好麻烦,好想附图。。。。
3482 次点击
所在节点    Python
16 条回复
susecjh
2018-08-30 12:11:21 +08:00
这样好点,我们公司写一个 urls 里面,感觉像一坨屎
chenstack
2018-08-30 12:16:16 +08:00
因为一个项目可能会有多个子 app,各自的 url 映射写在各自的 urls.py 里面,再由主 urls.py 引入,方便管理
huangzhe8263
2018-08-30 12:17:12 +08:00
附图的话, 安 v2 的 chrome 插件然后用微博图床就行.

and 建议这种去看官方最新的文档...
chenstack
2018-08-30 12:21:46 +08:00
还有你说的 path 是 django 2.0 的写法,建议多看看官方文档,另外也可以用旧的写法的,旧模块有保留。
新写法的话,基本就是 url 替换成 path,include 的引入位置也换了
from django.urls import path, include
KinneyZhang
2018-08-30 12:32:03 +08:00
谢谢!
不过为什么一个项目会有不同的 app 呢?一个项目不就是一个 app 吗?麻烦举一个例子,新人刚学 django
xpresslink
2018-08-30 13:02:09 +08:00
在 settings-py 里面有个 ROOT_URLCONF = 设置,用来指明项目最初始的 URL 解析。

理论上说是可以把整个项目所有 URL 都放在这一个文件里面的。如果是个小项目这么做也没有什么问题。

但是一个大项目下面有多个子 app,URL 条目太多了放在一个文件中不好维护。

所以在每个 app 目录下加一个 urls.py (文件名随便,只是习惯上大家都这么起名字, 只要在 include 时候对应上就可以), 管理本 app 的 URL。

在项目初始的 urls.py 中用 include ('app_name.urls')方式把 app 的 URL 定义合并到一起。

这样做的好处是这个 app 比较容易摘除,或拿到别个项目中去复用。
chenstack
2018-08-30 13:02:10 +08:00
@KinneyZhang 举个例子,一个小程序商场后端,分成商户管理后台和小程序 api 两个 app。或者几个小项目共用账户系统也是有可能的。
anthoy
2018-08-30 13:47:39 +08:00
以下是菜鸡我的理解:
django 默认创建的时候在自动生成的文件夹(和你的项目命一样的,我也忘了叫什么,暂时叫主目录,里面是一些配置文件)中会自动生成一个 urls.py 文件,里面可以进行 url 与 view 的关联,但在很多大型网站开发中,对于要使用的 url 数量比较多,为了更好的管理,通过创建不同的 app 进行功能划分,每个 app 下创建自己的 urls.py 文件,通过 includet 添加到主目录下的 urls.py 文件中,实现 urls 模块化管理,有点类似 flask 的蓝图的模块化
好处:大型网站多个 app 时,url 管理方便,而且可以通过在主目录中为每个 app 的 url 设置同一的前缀
RuAHip
2018-08-30 14:09:46 +08:00
楼主你好,最近我也在看那块代码,我直接在 ubuntu 上按照书上写的来实现的,但是运行的时候,就报错了,然后发现时版本问题,书上的版本是 Django 1.xx 。而我现在用的是 Django 2.1,两个版本导入包不一样。我想问一下你是否遇到了在添加了新的 urls 配置之后,发现项目 启动失败,报错。
zjb861107
2018-08-30 14:30:09 +08:00
书上的版本是 Django 1.xx 。而我现在用的是 Django 2.1

————————

你可以在安装的时候指定版本的,先把 demo 跑起来,基本原理搞明白,再去尝试最新版
RuAHip
2018-08-30 14:59:05 +08:00
@zjb861107 好的,谢谢大佬。
KinneyZhang
2018-08-30 17:38:15 +08:00
@RuAHip 是的,就是这个问题,所有我准备听大佬们的意见,去看看 django2.x 的说明文档
toono
2018-08-30 19:18:05 +08:00
建议看一看 Django 官网的文档,一目了然,而且 QuickStart 这部分有中文。
Anjaxs
2018-08-30 23:11:46 +08:00
yuoboo
2018-08-31 11:05:58 +08:00
大致说一下,说得不对的地方请指正!
有 settings,wusgi 的目录称为项目同名目录, 因为在创建项目的时候这个文件夹自动创建而且名字与项目名相同,
项目同名目录中的 urls.py 文件为全局视图映射管理, url 传到这里通过正则匹配,这里之所有分为两层 urls.py 文件是为了方便管理和查找,而且结构更为清晰, 第二个 urls.py 文件一般位于 APP 文件夹里面, 负责某一个 APP 的视图映射, 如果你只想写一个 urls.py 文件也是可以的,将所有 APP 的视图函数全部导入到项目同名目录的 urls.py, 这样 APP、视图函数多了之后会非常的混乱, 一般项目十多个 APP 或者更多,每个 APP 十几或者几十个视图函数的时候, 你这个 urls.py 文件中上百条映射查找起来是一件很头疼的事情, 修改的时候你还得上下翻滚交叉查找, 你才会发现把不同 APP 的映射关系独立出来是一件多么明智的事情!
尝试理解这个设计, 说不定楼主用顺手了还会觉得,哇这样分还是有道理的!哈哈哈~~~~
huaerxiela
2018-08-31 17:52:32 +08:00
@KinneyZhang 抽象多个 app 才比较合适,你说的项目一个 app 的情况,一般情况下都是设计的不太合理,就像数据库的设计一定不要让新手弄得道理一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/484505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX