有多少种URL,就会存在多少种页面,每种页面对应一类URL,然后再来编写View的代码,这样可以去掉重复的逻辑。接着就要分析页面上需要呈现的数据,不同的数据意味这要用到不同的模型或者字段。所以URL配置很重要。
MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求
- M:models 数据库相关
- V:views 视图相关
- C:controller 控制器 url分发
MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
- M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 代表模板 (Template):负责如何把页面展示给用户(html)。
- V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template
- M:models 数据库相关
- T:templates 模板 html文件
- V:views 视图相关 控制器 和 url分发
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
URL基本概念
URL全称为(UniformResoureLocator)意为“统一资源定位符”。URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL格式
schema://host[:port#]/path/.../[?query-string][#anchor]
举例:http://192.168.1.222:8000/hello/
- schema(协议):http
- host(主机,常指服务器主机):192.168.1.222
- port(端口):8000
- path(路径):hello/
URL功能
- URL配置(URLconf)就像是Django所支撑网站的目录,视图的映射表
- URL映射到Django中视图的地址,返回页面的响应
规划url.py
URL是使用正则表达式编写,比如url(r’^admin/’, admin.site.urls),就是访问admin路径,即http://192.168.1.222:8000/admin
为了方便管理url,这里建议把应用对应的url挡在应用的文件夹内
-
在myblog/blog/apps/config下创建urls.py文件
-
将该应用的URL统一写到这个文件内,引入views
from django.conf.urls import url from . import views urlpatterns = [ # 首页 url(r'^$', views.index, name='index'), # 主页,自然排序 ]
-
项目的URL(项目urls)关联应用APP(config)的url,关联后,起作用的实际是
源码
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
引入include并添加
from django.conf.urls import url from django.contrib import admin from django.conf.urls import include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'', include('config.urls', namespace='blog')), ]
我们这里导入了一个
include
函数,然后利用这个函数把 config应用下的 urls.py 文件包含了进来。
此外 include 前还有一个
''
,这是一个空字符串,当然这里也可以写其它字符串,django 会把这个字符串和后面 include 的 urls.py 文件中的 URL 拼接。比如说如果我们这里把
''
改成'index/'
,而我们在config\urls.py 中写的 URL 是''
,即一个空字符串。那么 django 最终匹配的就是index/
加上一个空字符串,即index/
。 如果在config\urls.py 中写的 URL 是'^nihao$'
,那地址就是`index/nihao’,即http://127.0.0.1:8000/index/nihao
编写views
只是为了演示,views会单独配置
-
打开myblog/blog/apps/config/views.py文件
-
写入下面代码
def index(request): return HttpResponse("欢迎访问我的博客首页!")
-
运行server,打开http://127.0.0.1:8000/
-
显示:欢迎访问我的博客首页!
URL分享
from django.conf.urls import url
from .views import IndexView, AboutView, ArticleView, CategoryView, TagView, MySearchView, ArchivesView
urlpatterns = [
# 首页
# url(r'^$', IndexView.as_view(template_name='index.html'), name='index'), # 主页,自然排序
url(r'^$', IndexView.as_view(), name='index'), # 主页,自然排序
# 关于自己
url(r'^about/$', AboutView, name='about'),
url(r'^archives/$', ArchivesView.as_view(), name='archives'),
# url(r'^about/$', TagView.as_view(), name='about'),
# 文章详情页面
url(r'^article/(?P<pk>[0-9]+)/$', ArticleView.as_view(), name='article'),
url(r'^category/(?P<name>\w+)/$', CategoryView.as_view(), name='category'),
url(r'^tag/(?P<pk>[0-9]+)/$', TagView.as_view(), name='tag'),
# url(r'^search/$', search, name='search'),
# url(r'^search/$', MySearchView, name='search_view'),
url(r'^search/$', MySearchView.as_view(), name='search'),
]