使用Django,你会用不同的方法来说明这两件事:页面的内容是靠view function(视图函数)来产生,URL定义在URLconf中
01 基于Django的第一个页面:Hello world
明白一点:
每个视图必须要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse
对象,或者抛出一个异常,比如 Http404
。至于你还想干些什么,随便你
1.首先在建立的app目录下 (/func1/views.py) 打开views.py 文件,书写如下代码
from django.shortcuts import HttpResponse
def hello(request):
return HttpResponse("Hello world")
首先介绍第一个知识点:
HttpResponse:将括号里面的内容以字符串传递给页面
在这里就必须介绍另一个函数:render()
载入模板,填充上下文,再返回由它生成的 HttpResponse
对象
2.建立视图之后需要建立url 映射,使URL访问http://127.0.0.1:8000/hello/ 即调用hello函数返回hello world
由于我们的视图函数在项目mysite里面应用func1下,即视图目录是:/mysite/func1/views.py。我们可以建立两种方法进行路由分配
2.1第一种:直接在项目的urls.py文件下建立url映射,在/mysite/urls.py 代码如下
from django.conf.urls import url
from django.contrib import admin
from func1 import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^hello/', views.hello),
]
其中语句:from func1 import views 即从func1文件里导入views文件,当我们在url匹配到hello时,就会在views.py下找到对应的函数,其输出结果如下:
2.2 第二种 进行路由分发
注:当使用原始的url 匹配时,我们的url都写在ulrs.py 文件里,当我们实际项目中不止一个应用app时会出现url在文件中累积或命名冲突,因此我们使用路由分发来解决。
我们在应用目录func1下建立新的urls.py文件
在项目目录(mysite)下的urls.py 书写代码如下
from django.conf.urls import url,include
from func1 import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^func1/', include('func1.urls')),
]
在应用目录下(func1)的urls.py代码如下
from django.conf.urls import url
from func1 import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^hello/', views.hello),
]
运行结果如下:
注:运行过程说明,当我们在url中输入/func1/hello/ 时,首先匹配 func1/,通过include(func1.urls.py)将url匹配到func1/urls.py 文件中,再在文件中匹配函数 hello,输出结果Hello world,
3.对函数url的说明
def url(regex, view, kwargs=None, name=None):
return re_path(regex, view, kwargs, name)
其中url有四个参数:两个必须参数:regex 和 view
,两个可选参数:kwargs
和 name
regex:类似正则表达式,进行路由匹配
view:调用特定的视图函数
kwargs:任意个关键字参数可以作为一个字典传递给目标视图函数
name:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式
4.于此类似的函数 path
path() 参数: route
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。
这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。
path() 参数: view
当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子。
path() 参数: kwargs
任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。
path() 参数: name
为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式
举一个上面的例子:
在项目的urls.py中书写以下代码
from django.urls import path
from func1 import views
urlpatterns = [
path('hello/', views.hello),
]
运行代码如下:
02 原理与过程
1.原理
当我们在浏览器中输入url是,Django所有的响应都基于settings.py。当你运行python manage.py runsrver,脚本将在于manage.py 同一个目录下查找名为settings.py的文件,这个文件包含了所有有关这个Django项目的配置信息,例如:项目更目录 BASE_DIR,注册app INSTALLED_APPS,中间件 MIDDLEWARE ,url目录 ROOT_URLCONF,模板 TEMPLATES,网关服务通信接口应用 WSGI_APPLICATION,数据库 DATABASES,静态文件目录 STATIC_URL,STATICFILES_DIRS等等
2.url核心设置 ROOT_URLCONF
此设置作为URLconf 告诉Django在这个站点中那些python的模块将被用到
ROOT_URLCONF = 'mysite.urls'
3.具体工作过程
当访问url/hello/时,Django根据ROOT_URLCONF的设置装载URLCONF,然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。当找到这个匹配的URLpatterns就调用相关联的view函数,并把HttpRequest对象作为第一个参数。一个视图功能必须返回一个HttpResponse。一旦做完,Django将完成剩余的转换python的对象到一个合适的带有HTTP头和body的Web Response
03 总结
1.进来请求 /hello/
2.Django通过在ROOT_URLCONF配置来决定跟URLconf
3.Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目
4.如果找到匹配,将调用相应的视图函数
5.视图函数返回一个HttpResponse(或者使用render()进行返回hmtl页面,但实质也是字符串)
6.视图函数返回一个HttpResponse
7.Django转换HttpResponse为一个合适的HTTP response,以Web page 显示出来
f
02