zoukankan      html  css  js  c++  java
  • Django学习day4——视图和URL配置

    创建一个简单的hello world

    在day3中我们第一次运行了服务器,里面是一个django的欢迎页面,那是因为我们没有配置URL和视图,django在底层会自动跳转这个页面上

    我们在mysite上创建一个views.py文件。这个文件是用来放置视图的,文件名可以任意,但是根据约定,把它命名成view.py是个好主意,这样有利于其他开发者读懂你的代码

    我们的Hello world视图非常简单。 这些是完整的函数和导入声明,你需要输入到views.py文件:

    创建视图

    from django.http import HttpResponse
    
    def hello(request):
        return HttpResponse("Hello world")
    这个函数只有简单的一行代码: 它仅仅返回一个HttpResponse对象,这个对象包含了文本“Hello world”。

    每个视图函数至少要有一个参数,通常被叫作request。 这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个示例中,我们虽然不用request做任何事情,然而它仍必须是这个视图的第一个参数。
    一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。 

    配置URLconf

    因为我们已经运行过了一次django,系统自动生成了urls.py

    from django.contrib import admin
    from django.urls import path
    from mysite import views 
    
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]

    我们需要把视图添加进urlpatterns中。

    但是在那之前我们需要导入视图的模块,from mysite import views 或者你也可以用from . import views (当前目录下的views模块)

    from mysite import views
    path('hello/',views.hello)

     这时我们就可以运行django了

    这时显示的是404页面,因为我们没有指定首页面,但仔细看提示信息,它说模块中还有admin,和hello

    我们打开http://127.0.0.1:8000/hello/,这时页面就出现了Hello world 了,这证明我们视图和URL配置是正确的。

    顺便看一下admin中有什么打开http://127.0.0.1:8000/admin/,这时一个django的后台管理页面但是此时我们还没有配置好管理员的账号和密码,所以登陆不了。

    django2.x正则

    django2.x正则的URL配置已经不支持正则了,这里我们得引入re_path,这时就能匹配正则

    我们现在多设置两个方法,一个是当前获取时间,一个是获取时间+时间偏差量

     urls.py

    from django.contrib import admin
    from django.urls import path,re_path
    from mysite import views 
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('hello/',views.hello),
        path('time/',views.current_datetime),
        re_path(r'time/plus/(d{1,2})',views.hours_ahead)
    ]

    这里的re_path用正则,去匹配plus后面的两位数字

    views.py:

    from django.http import HttpResponse,Http404
    import  datetime
    def hello(request):
        return HttpResponse("Hello world")
    
    def current_datetime(request):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)
    
    def hours_ahead(request,offset):
        try:
            offset = int(offset)
        except ValueError:
            raise Http404()
        dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
        html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
        return HttpResponse(html)

     这时打开http://127.0.0.1:8000/time/plus/1,你会发现出现了你当前的时间+1小时

    In 1 hour(s), it will be 2019-04-12 13:28:25.846214.
    

     

    如果你在一个不能转换成整数类型的值上调用int(),Python将抛出一个ValueError异常。如:int(‘foo’)。在这个例子中,如果我们遇到ValueError异常,我们将转为抛出django.http.Http404异常——正如你想象的那样:最终显示404页面(提示信息:页面不存在)。机灵的读者可能会问: 我们在URL模式中用正则表达式(d{1,2})约束它,仅接受数字怎么样?这样无论如何,offset都是由数字构成的。 答案是:我们不会这么做,因为URLpattern提供的是“适度但有用”级别的输入校验。万一这个视图函数被其它方式调用,我们仍需自行检查ValueError。 实践证明,在实现视图函数时,不臆测参数值的做法是比较好的。

    这里我们更引用了其他人的例子更详细的解释了django的paht转换器,当然你也可以自定义path转换器

    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles/<int:year>/', views.year_archive),
        path('articles/<int:year>/<int:month>/', views.month_archive),
        path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    ]
    注意:
    
    要捕获一段url中的值,需要使用尖括号,而不是之前的圆括号;
    可以转换捕获到的值为指定类型,比如例子中的int。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;
    匹配模式的最开头不需要添加/,因为默认情况下,每个url都带一个最前面的/,既然大家都有的部分,就不用浪费时间特别写一个了。
    匹配例子:
    
    /articles/2005/03/ 将匹配第三条,并调用views.month_archive(request, year=2005, month=3);
    /articles/2003/匹配第一条,并调用views.special_case_2003(request);
    /articles/2003将一条都匹配不上,因为它最后少了一个斜杠,而列表中的所有模式中都以斜杠结尾;
    /articles/2003/03/building-a-django-site/ 将匹配最后一个,并调用views.article_detail(request, year=2003, month=3, slug="building-a-django-site"
    二、path转换器
    默认情况下,Django内置下面的路径转换器:
    
    str:匹配任何非空字符串,但不含斜杠/,如果你没有专门指定转换器,那么这个是默认使用的;
    int:匹配0和正整数,返回一个int类型
    slug:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线,比如’ building-your-1st-django-site‘;
    uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写,例如’075194d3-6885-417e-a8a8-6c931e272f00‘ 。返回一个UUID对象;
    path:匹配任何非空字符串,重点是可以包含路径分隔符’/‘。这个转换器可以帮助你匹配整个url而不是一段一段的url字符串。

    参考: 

    http://www.liujiangblog.com/course/django/182

    http://docs.30c.org/djangobook2/chapter03/index.html

  • 相关阅读:
    Regular Expression Matching
    Palindrome Number
    String to Integer (atoi)
    Reverse Integer
    ZigZag Conversion
    Longest Palindromic Substring
    Add Two Numbers
    git 操作原理
    ES6学习之路2----变量的解构赋值
    ES6学习之路1----变量的声明
  • 原文地址:https://www.cnblogs.com/luocodes/p/10695313.html
Copyright © 2011-2022 走看看