Django-视图URL

在windows下面使用 django-admin startproject mysite(项目名称)创建一个项目

E:\yqdjango>django-admin startproject mysite

这样会生成是个主要文件

  • init.py:让python把该目录当做一个开发包所需的文件
  • manage.py:命令行工具允许你使用多种方式与该Djiango项目进行交互(使用python manage.py help获取信息)
  • setting:Django项目设置和配置
  • urls:Django项目的url设置,视为Django的网站目录

运行开发服务器:Django内置的一个用于开发调试的服务器(只能处理单个的请求)不要用于网站发布

E:\yqdjango\mysite>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 28, 2017 - 12:49:21
Django version 1.11.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

这样就在127.0.0.1:8000上运行了调试服务器。后面的开发可以不用关闭服务器,当你对项目进行修改时。这个服务器会自动检索修改进行内容更新。
修改端口和IP

E:\yqdjango\mysite>python manage.py runserver 8080
E:\yqdjango\mysite>python manage.py runserver 0.0.0.0:8080

当你指定IP时就允许非本地的连接访问

  • 视图
    当你发布一个内容为hello world名叫hello.html的文件时。这时你应该已经知道url和字符串的含义。
    在Django中页面内容是使用view function(视图函数产生的)。urls(URLConf)定义的。
    • 第一份视图
      在mysite中创建views.py(这里将包含这一张使用的视图,这里的命名是没有要求的这里只是让他符合环境)
      每一个视图函数都至少包含一个参数,常被叫做request,这是用于出发这个视图,包含当前web请求信息对象的django.http.HttpRequest对象实例
      HttpRequest和HttpRespomse?
from django.http import HttpResponse

def hello(request):
    return HttpResponse("hello world");

一个视图就是一个python函数,第一个参数类型是HttpRequest,返回HttpResponse(使一个python函数成为一个Django可识别视图必须满足的条件)

  • url配置(URLconf):Django支持的网站目录,URL模式(urls.py)以及要为该URL模式调用视图函数之间的映射表(谁调用什么代码)
    urls.py在创建时已经默认导入了一些包
from django.conf.urls import url
from django.contrib import admin
from mysite.views import hello
urlpatterns = [
    url(r'^hello/$', hello),
    #所有指向URL/hello/的请求都由hello视图函数处理
]

urlpatterns定义了URL以及用于处理URL的代码映射关系Django能从ROOT_URLconf中找到它(新建项目时,Django默认映射关系,显示欢迎界面)
如想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可。

  • python搜索路径
    使用import语句时,语句导入的内容就是python所查找的系统目录清单
    python查找按照当前,和url顺序查找
    Django检查URL模式前默认移除申请URL开头的斜杠(URL模式通常使用正则表达式),为尾部添加斜杠(/)
    python和其他的动态语言有一个重要特性:函数是作为对象传递的,而不是调用(函数是一级对象,可以像变量一样传递函数)
    正则表达式:

  • 关于404错误
    URLconf只定义了单一的URL模式,处理urls.py中指定的url,当访问其他url时会出现404。因为你的UR申请在URLconf中没有定义

    url(r'^$', hello),
    #空串表示当前目录

这样可以为所有申请使用hello。一般用于index页面
404页面只有在开发者模式下才显示,对用户透明

Django处理请求
GET:request.GET相当于一个字典,推荐request.GET.get(‘a’,0)没有传递时默认使用0
request与网页传递参数有关,封装GET和POST
视图中的参数传递

 #/add/3/4/ 这样的网址的方式
 def add2(request, a, b):

浏览器输入url,django后台怎么动作的那?
所有的一切均始于setting文件(包含着所有有关这一个django项目的配置信息,其中ROOT_URLCONF,他作为URLconf告诉django这个站点中那些python模块被使用)
输入url时 django —> root_urlconf —> 顺序匹配urls —> urlpatterns —> 调用view(视图函数) — >httprequest对象作为函数第一参,开始函数 —>httpresponse返回结果 —> django转换python的对象到web response(网页内容)转HttpResponse为 HTTP response 显示web page

  • URL配置和松耦合
    保证互换性。如url返回那个视图函数(在不同地方修改一块而不影响另一块,相互关联不紧密)url与视图关系也需要在URL配置中修改

动态视图:内容可以变换的视图
在views.py中放入视图函数(当前日期和时间显示在网页
1.计算当前时间
2.返回包含这些值的httpresponse)

动态视图和动态URL
web应用中,url常常包含相关参数,显示时间加上时间偏移量

#这是视图函数current_time
from django.http import HttpResponse
import datetime

def current_time(request,offset):
    try:
        offset = int(offset);
    except ValueError:
        raise Http404();
    #在不能转换成int的字符串中调用int()会出现valueError
    now = datetime.datetime.now() + datetime.timedelta(hours=offset);
    html = "It is  %s,now %s"%(offset,now);
    return HttpResponse(html);

这样视图函数就多出一个参数时间差,offset从匹配的URL中提取出来,捕获值重视Unicode objects,而不是简单的python字符串。但是这样有个不好的地方就是硬编码HTML在代码中。过于混杂不利于维护。
django核心理念是让URL看起来漂亮、更加清晰,所有使用正则表达式来进行urls映射

urlpatterns = [
    url(r'^time/plus/(\d{1,2})/$', current_time),
]
#显示最大99个小时的偏移量

正则表达式前面的r是告诉python这是一个原始字符,不用处理里面的反斜杠使用圆括号把参数在url模式中标识出来

补充

只有将app加入了appinstall中,Django才能在render时自动找到appinstall中列出app的templates文件
DEBUG=true时Django才能自动找到appinstall中列出app的static静态文件(图片,css等)

  • 获取网址的方式
  • python代码中,reverse接收url中的name作为参数 reverse(‘add2’, args=(a, b))
  • 模板中{% url ‘name’参数 参数 %}
  • url中的name相当于网址的名字,用名字获取网址
#一个不用的网址的重定向
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def old_add_redirect(requset,a,b):
    return HttpResponseRedirect(reverse('add',args=(a,b)))

#urls中
url(r'^add/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

你可能感兴趣的:(Django)