Django学习之路6-Views.py 和 urls.py

网页程序的逻辑

request进来->从服务器获取数据->处理数据->把网页呈现出来
url 设置至关于客户端向服务器发出request请求的入口, 并用来指明要调用的程序逻辑
views 用来处理程序逻辑, 而后呈现到template(通常为GET方法, POST方法略有不一样)
template 通常为html+CSS的形式, 主要是呈现给用户的表现形式html

简单Django Views和URL

Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 而后返回HTTPResponsepython

那么那么开始在my_blog/article/views.py中编写简单的逻辑(经过在views中编写对应的接收request的函数,)正则表达式

#如今你的views.py应该是这样
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def home(request):
    return HttpResponse("Hello World, Django")

那么如何使这个逻辑在http请求进入时, 被调用呢, 这里须要在my_blog/my_blog/urls.py中进行url设置数据库

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'my_blog.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'article.views.home'),  #因为目前只有一个app, 方便起见, 就不设置include了
)

url()函数有四个参数, 两个是必须的: regex和view, 两个可选的:kwargs和nameexpress

  • regex 是regular expression的简写,这是字符串中的模式匹配的一种语法, Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。须要注意的是,这些正则表达式不会匹配 GET 和 POST 参数,以及域名。 例如:针对 http://www.example.com/myapp/ 这一请求,URLconf 将只查找 myapp/。而在http://www.example.com/myapp/?page=3 中 URLconf 也仅查找 myapp/ 。
  • view;当 Django 匹配了一个正则表达式就会调用指定的view视图功能,包含一个 HttpRequest 实例做为第一个参数和正则表达式 “捕获” 的一些值的做为其余参数。 若是使用简单的正则捕获,将按顺序位置传参数;若是按命名的正则捕获,将按关键字传参数值。上面代码中调用article/views.py中的 home函数。
  • kwargs 任意关键字参数可传一个字典至目标view
  • name 命名你的 URL, 使url在 Django 的其余地方使用, 特别是在模板中。 这一强大的功能可容许你经过一个文件就可全局修改项目中的 URL 模式。

如今在浏览器中输入127.0.0.1:8000应该能够看到下面的界面django

成功

Django Views和URL更进一步

给view中的函数逻辑传入参数

不少时候咱们但愿给view中的函数逻辑传入参数, 从而呈现咱们想要的结果浏览器

如今咱们这样作, 在my_blog/article/views.py加入以下代码:服务器

def detail(request, my_args):
    return HttpResponse("You're looking at my_args %s." % my_args) #这里的参数为my_args

在my_blog/my_blog/urls.py中设置对应的urlapp

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'my_blog.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'article.views.home'),
    url(r'^(?P<my_args>\d+)/$', 'article.views.detail', name='detail'),
#这里的article.views.detail是调用article/views.py中的detail函数,
)

^(?P<my_args>\d+)/$ 这个正则表达式的意思是将传入的一位或者多位数字做为参数传递到views中的detail做为参数, 其中 ?P<my_args> 定义名称用于标识匹配的内容函数

正则知识:?P<my_args> 这个表明除了原有的编号外,再指定一个ID,这里指定为my_args

^(?P<my_args>\d+)/$ 这整个正则表示指定匹配一个或者多个数字,ID为my_args,就是把匹配到的数字指定为my_args,至关于 my_args=‘匹配到的数字’

如下的url都能成功匹配这个正则表达数

  • http://127.0.0.1:8000/1/
  • http://127.0.0.1:8000/21/

尝试传参访问数据库

基于上面的设置 url.py和 views.py实现的匹配网址,咱们能够在 detail函数 中使用model的数据库API尝试传参访问数据库

修改在my_blog/article/views.py代码:

from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article

# Create your views here.
def home(request):
    return HttpResponse("Hello World, Django")

def detail(request, my_args):
    post = Article.objects.all()[int(my_args)]
    str = ("title = %s, category = %s, date_time = %s, content = %s" 
        % (post.title, post.category, post.date_time, post.content))
    return HttpResponse(str)
  • 这里最好在admin后台管理界面增长几个Article对象, 防止查询对象为空, 出现异常

如今能够访问http://127.0.0.1:8000/1/

显示以下数据表示数据库访问正确(这些数据都是本身添加的), 而且注意Article.objects.all()返回的是一个列表

数据

小结:

  • 如何编写views和设置url
  • 如何经过url向views传参
  • 如何经过参数来访问数据库资源

 

更多视图的学习:

如今让咱们添加一些视图到 polls/views.py 中去。这些视图与以前的略有不一样,由于 它们有一个参数:

def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of poll %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)

将新视图按以下所示的 url() 方法添加到 polls.urls 模块中去:

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

在你的浏览器中访问 http://localhost:8000/polls/34/ 。将运行 detail() 方法而且显示你在 URL 中提供的任意ID 。

试着访问 http://localhost:8000/polls/34/results/ 和 http://localhost:8000/polls/34/vote/ – 将会显示对应的结果页及投票页。

当有人访问你的网站页面如 “ /polls/34/ ” 时,Django 会加载 mysite.urls 模块,这是由于 ROOT_URLCONF 设置指向它。接着在该模块中寻找名为urlpatterns 的变量并依次匹配其中的正则表达式。

include() 可以让咱们便利地引用其余 URLconfs 。请注意 include() 中的正则表达式没有 $ (字符串结尾的匹配符 match character) 而尾部是一个反斜杠。当 Django 解析 include() 时,它截取匹配的 URL 那部分而把剩余的字符串交由 加载进来的 URLconf 做进一步处理。

注意:这里的urls.py是有两个的,项目是总的urls.py,每一个应用里面设置本身的urls.py,进行精确的匹配,两边是分离开了,而后在项目里面的urls里include就行。

include() 背后隐藏的想法是使 URLs 即插即用。 因为 polls 在本身的 URLconf(polls/urls.py) 中所以它们能够被放置在 “/polls/” 路径下,或 “/fun_polls/” 路径下,或 “/content/polls/” 路径下,或者其余根路径,而应用仍能够运行。

如下是当用户访问 “/polls/34/” 路径时系统中将发生的事:

  • Django 将寻找 '^polls/' 的匹配,这个在项目文件夹下的 mysite/urls.py 找到
  • 接着,Django 截取匹配文本 ("polls/") 后剩余的文本 – "34/" – 传递到 ‘polls.urls’ URLconf 中做进一步处理, 再将匹配 r'^(?P<poll_id>\d+)/$' 的结果做为参数传给 detail() 视图
detail(request=<HttpRequest object>, poll_id='34')

poll_id='34' 这部分就是来自 (?P<poll_id>\d+) 匹配的结果。

使用括号包围一个 正则表达式所“捕获”的文本可做为一个参数传给视图函数;?P<poll_id> 将会定义名称用于标识匹配的内容; 而 \d+ 是一个用于匹配数字序列(即一个数字)的正则表达式。

 

转载于:https://my.oschina.net/ZZKAJ23/blog/870119