2.1 第一个页面django驱动的页面:hello world
2.1.1 第一个视图
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello World")
2.1.2 第一个URL配置
from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^hello/$', hello),
]
正则表达式字符串前面的 ‘r’ 字符。它的目的是告诉 Python,那是“原始字符串”,不要解释里面的反斜线。从端口加斜杠后面开始算。
访问http://192.168.139.128:8000/hello/,返回结果hello world
2.1.3 正则表达式
符号 | 匹配的内容 |
---|---|
.(句点) | 单个字符 |
\d | 单个数字 |
[A-Z] | A-Z之间的单个字母 |
[a-z] | a-z之间的单个字母 |
[A-Za-z] | a-z(不区分大小写)之间的单个字母 |
+ | 一个或多个前述表达式 |
[^/]+ | 一个或多个字符,知道遇到斜线 |
? | 零个或一个前述表达式 |
* | 零个或多个前述表达式 |
{1,3} | 1到3个之间前述表达式 |
2.1.4 关于 404 错误的简要说明
2.1.5 关于网站根地址的简要说明
from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello, my_homepage_view
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^hello/$',hello),
url(r'^$',my_homepage_view), #设置网站根目录
]
测试结果
2.1.6 Django 处理请求的过程
过程概述:
运行 python manage.py runserver 命令时,manage.py 脚本在内层 mysite 目录中寻找为 settings.py 的文件,其中最重要的设置是 ROOT_URLCONF(ROOT_URLCONF = ‘mysite.urls’)。它告诉 Django,网站的 URL 配置在哪个 Python 块中,这个模块对应的文件是 mysite/urls.py。收到针对某个 URL(假如是 /hello/)的请求时,Django 加载ROOT_URLCONF 设置指定的 URL 配置;然后按顺序检查 URL 配置中的各个 URL 模式,依次与请求的 URL 比较,直到找到匹配的模式为止,找到匹配的模式之后,调用对应的视图函数,并把一个 HttpRequest 对象作为第一个参数传给视图。随后,余下的工作交给 Django 处理:把那个 Python 对象转换成正确的 Web 响应,并且提供合适的 HTTP 首部和主体(即网页的内容)
处理请求过程:
1. 请求 /hello/。
2. Django 查看 ROOT_URLCONF 设置,找到根 URL 配置。
3. Django 比较 URL 配置中的各个 URL 模式,找到与 /hello/ 匹配的那个。
4. 如果找到匹配的模式,调用对应的视图函数。
5. 视图函数返回一个 HttpResponse 对象。
6. Django 把 HttpResponse 对象转换成正确的 HTTP 响应,得到网页
2.2 第二个视图:动态内容
#mysite/views.py
from django.http import HttpResponse
import datetime
def hello(request):
return HttpResponse("Hello World")
def my_homepage_view(request):
return HttpResponse("网站根目录")
def current_datetime(request):
now = datetime.datetime.now()
html = 'It is now %s.' % now
return HttpResponse(html)
#mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello, my_homepage_view,current_datetime
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^hello/$',hello),
url(r'^$',my_homepage_view),
url(r'^time/$',current_datetime),
]
2.3 URL 配置和松耦合
from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello, my_homepage_view,current_datetime
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^hello/$',hello),
url(r'^$',my_homepage_view),
url(r'^time/$',current_datetime),
url(r'^other_time/$',current_datetime),
]
2.4 第三个视图:动态 URL
#我们使用圆括号从匹配的文本中捕获数据,传给视图函数
from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello, current_datetime, hours_ahead
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^hello/$', hello),
url(r'^time/$', current_datetime),
url(r'^time/plus/(\d{1,2})/$', hours_ahead),
]
#views.py
def hours_ahead(request,offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "In %s hours , it will be %s ." % (offset,dt)
return HttpResponse(html)
#hours_ahead 视图函数有两个参数:request 和 offset。
#• request 是一个 HttpRequest 对象,这与 hello 和 current_datetime 两个视图一样。我要再次强调,每个视图的第一个参数都是 HttpRequest 对象。
#• offset 是 URL 模式中那对圆括号捕获的字符串。如果请求的 URL 是 /time/plus/3/,那么偏移量是字符串 '3';如果请求的 URL 是 /time/plus/21/,那么偏移量是字符串 '21'。注意,捕获的值始终是Unicode 对象,而不是整数,即便捕获的字符串中只有数字(如 '21')也不是。