美文网首页
django学习笔记二:视图

django学习笔记二:视图

作者: 小小白老鼠 | 来源:发表于2016-09-19 22:43 被阅读0次
    picpic

    建立第一个项目


    新建工程

    1. 进入你要建立工程的目录,键入如下命令(其中mysite是你的项目名称):

    django-admin startproject mysite

    1. 建立完成之后,目录结构是这个样子的:

    .

    └── mysite

    ├── manage.py

    └── mysite

    ├── init.py

    ├── settings.py

    ├── urls.py

    └── wsgi.py

    • init.py:

    让Python 把该目录当成一个开发包 (即一组模块)所需的文件。 这是一个空文件,一般你不需要修改它。

    • manage.py:

    一种命令行工具,允许你以多种方式与该 Django 项目进行交互。 键入python manage.py help,看一下它能做什么。 你应当不需要编辑这个文件;在这个目录下生成它纯是为了方便。

    • settings.py:

    该 Django 项目的设置或配置。 查看并理解这个文件中可用的设置类型及其默认值。

    • urls.py:

    Django项目的URL设置。 可视其为你的django网站的目录。 目前,它是空的。

    1. 启动开发服务器

    进入你的网站目录,运行如下命令:

    python manage.py runserver

    会显示这样

    Validating models...

    0 errors found.

    Django version 1.0, using settings 'mysite.settings'

    Development server is running at http://127.0.0.1:8000/

    Quit the server with CONTROL-C.`

    默认使用的是8000端口,但是现在外网还不能访问。

    使用如下命令就可以实现外网访问:

    python manage.py runserver 0.0.0.0:8000


    视图和URL配置

    1. 通常我们需要将html文件放到服务器,然后访问服务器,此时我们用到了两个东西html(视图也就是页面的内容,在这里我们就认为是html页面就好了,就像cgi输出html一样)和url(也就是网址)。

    2. 页面的内容是靠view function(视图函数,对应的是你的html也就是说这个html是通过视图来产生的)来产生,URL定义在 URLconf 中(对应的是你的网址)

    第一个视图

    1. views.py

    视图就是包含n个函数的py文件

    我们随便建立一个py文件,比如叫做views.py,然后输入如下代码,当然,文件的位置是在你的mysite工程下面就是跟urls.py同一个目录,不过不是同一个目录也没有关系,我们看下面的代码:

    from django.http import HttpResponse

    def hello(request):

    return HttpResponse("Hello world")

    新建立一个views.py文件,然后定义了一个函数,名字叫hello,这就是一个视图函数。参数request是django.http.HttpRequest的一个实例,他必须是视图的第一个参数, 是包含当前请求信息的对象,当然,名字你可以随意取,叫r也可以,但是他必须位于第一个位置,也就是第一个位置留给request。

    一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个

    HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。

    1. urlconf

    既然有了视图(也就是我们有了html页面),那么我们就需要绑定网址和页面,让django知道访问哪一个网址需要跳转哪一个页面,所以我们需要将网址和视图进行绑定,此时就需要修改文件urls.py了,其内容如下:

    """mysite URL Configuration

    The urlpatterns list routes URLs to views. For more information please see:

    https://docs.djangoproject.com/en/1.9/topics/http/urls/

    Examples:

    Function views

    1. Add an import: from my_app import views

    2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')

    Class-based views

    1. Add an import: from other_app.views import Home

    2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')

    Including another URLconf

    1. Import the include() function: from django.conf.urls import url, include

    2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))

    """

    from django.conf.urls import url

    from django.contrib import admin

    urlpatterns = [

    url(r'^admin/', admin.site.urls),

    ]

    注意

    urlpatterns = [

    url(r'^admin/', admin.site.urls),

    ]

    urlpatterns是一个数组,里面存储了url()元素,url()中是一个网址接口和一个视图函数的对应,当然,网址接口可以使用正则表达式,r代表的是原始字符串,也就是里面的''什么的不会看成转义字符,视图函数需要你在前面导入进来,比如,我们要将我们的views.py文件中的hello视图函数跟网址/hello进行绑定,那么我们需要这么写,添加头部进行函数的导入:

    from mysite.views import hello

    然后我们修改urlpatterns如下:

    urlpatterns = [

    url(r'^admin/', admin.site.urls),

    url(r'^hello/$', hello),

    ]

    ** 另外需要注意的是,我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。 很酷吧!**

    python学习:元组()不可变,数组[即列表],字典{}。

    搜索路径:在python交互解释器中输入

    import sys

    print sys.path

    python3是print(sys.path)

    假设输出结果是['', '/usr/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5']

    Python 路径第一项的空字符串表示当前目录,那么会在当前目录进行搜索

    1. URLpattern的语法
    • 需要了解一些正则表达式的知识[占个坑](../../linux学习笔记/* shell学习/shell学习之正则表达式.md)

    • 不需要写前面的‘/’,django会自动移除请求前面的‘/’

    • 正则一定要对,否则匹配不了就访问不了网页

    • 网站根目录

    匹配模式一般写作r'^$',代表的是一个空串,例如:

    urlpatterns = [url(r'^$', mysite), ]

    那么你访问主页也就是跟目录,就会跳转到mysite

    1. 启动服务器python2.7 manage.py runserver,然后访问http://127.0.0.1:8000/hello

    django如何处理请求

    引用自the django book

    在继续我们的第二个视图功能之前,让我们暂停一下去了解更多一些有关Django是怎么工作的知识. 具体地说,当你通过在浏览器里敲http://127.0.0.1:8000/hello/来访问Hello world消息得时候,Django在后台有些什么动作呢?

    所有均开始于setting文件。当你运行python manage.py runserver,脚本将在于manage.py同一个目录下(包括子目录)查找名为setting.py的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写: TEMPLATE_DIRS , DATABASE_NAME , 等. 最重要的设置时ROOT_URLCONF,它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到。

    还记得什么时候django-admin.py startproject创建文件settings.py和urls.py吗?自动创建的settings.py包含一个ROOT_URLCONF配置用来指向自动产生的urls.py. 打开文件settings.py你将看到如下:

    ROOT_URLCONF = 'mysite.urls'

    相对应的文件是mysite/urls.py

    当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。 当找到这个匹配 的URLpatterns就调用相关联的view函数,并把 HttpRequest 对象作为第一个参数。 (稍后再给出 HttpRequest 的更多信息) (我们将在后面看到HttpRequest的标准)

    正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response,(例如,网页内容)。

    总结一下:

    1. 进来的请求转入/hello/.
    1. Django通过在ROOT_URLCONF配置来决定根URLconf.
    1. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
    1. 如果找到匹配,将调用相应的视图函数
    1. 视图函数返回一个HttpResponse
    1. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

    你现在知道了怎么做一个 Django-powered 页面了,真的很简单,只需要写视图函数并用 URLconfs把它们和URLs对应起来。 你可能会认为用一系列正则表达式将URLs映射到函数也许会比较慢,但事实却会让你惊讶。


    第二个视图 动态视图

    尝试一下这个,应该可以看懂,然后关联一下函数和url就可以了

    from django.http import HttpResponse

    import datetime

    def current_datetime(request):

    now = datetime.datetime.now()

    html = "It is now %s." % now

    return HttpResponse(html)

    然后我们在urls.py中导入这个函数并添加一个映射就可以了

    
    urlpatterns=[
    
    url(r'^time/$', current_datetime),
    
    ]
    
    

    以上就是一个简单的动态视图

    这并不是html应该的写法,只是一个简单的例子

    time_pictime_pic

    python2.7中字符串格式化

    
    print("i am %s, and i am %s year old" % ('abc', 19))
    
    "this is a %s string" % ("long")
    
    

    %s会将后面的内容转化成字符串

    关于时区

    需要在settings.py文件中更改这个值

    URL配置和松耦合(背后的哲学)说到这我觉得应该看一些软件开发哲学的书籍

    在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得 开发人员可以修改一块而不会影响另一块。这就是说,我们最好写代码的时候功能要单一,比如类有自己的功能,函数有自己的功能,不可以这个类或者函数可以进行各种功能,这样我们只需要在需要某一个功能的时候调用就好了。关于高内聚低耦合,大体就是前面加粗部分的意思吧

    当然,url配置里面我们可以随便对应,这部分不会影响实现部分。


    第三个视图 动态url

    url建议,一般有通用的东西django希望能够使用url,比如在url中添加数字,我们不使用查询字符串?d=3

    对于先写url对应还是先写视图,两者都可以

    r表示的是原始字符串,正则表达式是用圆括号来从文本里 提取 数据的

    注意:第一个参数必须是request,第二个参数一般是url中的匹配值

    1. 推荐使用正则表达式表示,比如选定数字页面,我们可以使用\d来表示数字页面:

    r'^time/\d{1, 2}$'

    这样我们就设计完成了一个动态url,我们可以访问/time/0,可以访问/time/1.../time/99,这个是正则表达式匹配的数字。

    现在我们需要获取url中匹配到的数字内容,在正则中,我们可以通过分组捕获的方法来获得指定的内容,同样,我们在这里也可以通过分组捕获的方法

    r'^time/(\d{1, 2})$'

    我们可以通过匹配偏移获得参数

    1. 我们有了动态url,那么我们需要动态url对应的视图,视图应该可以获取url中的数字。

    from django.http import Http404, HttpResponse

    import datetime

    def hours_ahead(request, offset):

    try:

    offset = int(offset)

    except ValueError:

    raise Http404()

    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)

    html = "In %s hour(s), it will be %s." % (offset, dt)

    return HttpResponse(html)

    现在,函数定义中出现了两个参数了,第一个是千年不变的request(当然可以取别的名字,但是其位置是留给request对象的,变量名无关紧要,重要的是他的位置,当然我们也可以直接使用关键字来定义key=?),第二个参数是offset,offset 是从匹配的URL里提取出来的。从来都是字符串。

    错误提示

    1. 可以通过出错页面来调试

    2. 可以在语句中添加assert False来设置错误进行调试,也就是触发错误

    3. 不过这些都应该是在debug模式下进行的,在互联网上我们不能让别人了解这些信息,所以需要禁用debug模式,django服务默认开启debug模式

    4. 出错页面是精华,可以提供大量信息

    **引用自the django book **

    在页面顶部,你可以得到关键的异常信息: 异常数据类型、异常的参数 (如本例中的 "unsupported type" )、在哪个文件中引发了异常、出错的行号等等。

    在关键异常信息下方,该页面显示了对该异常的完整 Python 追踪信息。 这类似于你在 Python 命令行解释器中获得的追溯信息,只不过后者更具交互性。 对栈中的每一帧,Django 均显示了其文件名、函数或方法名、行号及该行源代码。

    点击该行代码 (以深灰色显示),你可以看到出错行的前后几行,从而得知相关上下文情况。

    点击栈中的任何一帧的“Local vars”可以看到一个所有局部变量的列表,以及在出错 那一帧时它们的值。 这些调试信息相当有用。

    注意“Traceback”下面的“Switch to copy-and-paste view”文字。 点击这些字,追溯会 切换另一个视图,它让你很容易地复制和粘贴这些内容。 当你想同其他人分享这些异常 追溯以获得技术支持时(比如在 Django 的 IRC 聊天室或邮件列表中),可以使用它。

    你按一下下面的“Share this traceback on a public Web site”按钮,它将会完成这项工作。 点击它以传回追溯信息至http://www.dpaste.com/,在那里你可以得到一个单独的URL并与其他人分享你的追溯信息。

    接下来的“Request information”部分包含了有关产生错误的 Web 请求的大量信息: GET 和 POST、cookie 值、元数据(象 CGI 头)。 在附录H里给出了request的对象的 完整参考。

    Request信息的下面,“Settings”列出了 Django 使用的具体配置信息。 (我们已经提及过ROOT_URLCONF,接下来我们将向你展示各式的Django设置。 附录D覆盖了所有可用的设置。)

    相关文章

      网友评论

          本文标题:django学习笔记二:视图

          本文链接:https://www.haomeiwen.com/subject/sjinettx.html