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

  • 相关阅读:
    【LeetCode】17. Letter Combinations of a Phone Number
    【LeetCode】16. 3Sum Closest
    【LeetCode】15. 3Sum 三个数和为0
    【LeetCode】14. Longest Common Prefix 最长前缀子串
    【LeetCode】13. Roman to Integer 罗马数字转整数
    【LeetCode】12. Integer to Roman 整型数转罗马数
    【LeetCode】11. Container With Most Water
    【LeetCode】10. Regular Expression Matching
    Models of good programmer
    RSA Algorithm
  • 原文地址:https://www.cnblogs.com/luocodes/p/10695313.html
Copyright © 2011-2022 走看看