Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示。
一,新建一个mysite的项目
在dos命令中执行以下命令:
django-admin startproject mysite
运行后,如果成功的话, 我们会看到如下的目录样式:
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
我们会发现执行命令后,新建了一个 mysite 目录,其中还有一个 mysite 目录,这个子目录 mysite 中是一些项目的设置 settings.py 文件,总的urls配置文件 urls.py 以及部署服务器时用到的 wsgi.py 文件, init.py 是python包的目录结构必须的,与调用有关。
二、新建一个 learn APP应用
在dos命令中执行以下命令:
先进入mysite目录下
cd C:\Users\anrui\Desktop\anrui\mysite
后执行下面命令:
python manage.py startapp learn # learn 是一个app的名称
我们可以看到mysite中多个一个 learn 文件夹,其中有以下文件。
learn/
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
三、将新定义的app加到settings.py中
修改 mysite/mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn',
)
备注,这一步是干什么呢? 新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件) .
四、定义视图函数
修改 mysite/learn/views.py
from django.http import HttpResponse #引入HttpResponse模块
def index(request):#定义一个index函数
return HttpResponse(u"你好")#函数返回一个 HttpResponse 对象
注:
1.HttpResponse:它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上。
2.index()函数:第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容,用户浏览器,系统等信息在里面
3.return对象:函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示几个字到网页上。
五、定义视图函数相关的URL(网址)
修改 mysite/mysite/urls.py
from django.contrib import admin
from django.urls import path
from learn import views as learn_views # new导入应用中的相关模块并命名为learn_views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', learn_views.index), # new添加index的地址引导
]
六、在网页上做加减法
6.1.采用 /add/?a=4&b=5 这样GET方法进行
6.1.1修改 mysites/learn/views.py文件:(新定义一个add函数)
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a)+int(b)
return HttpResponse(str(c))
注:request.GET 类似于一个字典,更好的办法是用 request.GET.get(‘a’, 0) 当没有传递 a 的时候默认 a 为 0
6.1.2修改 mysites//urls.py 文件:(添加一个网址)
path('add/', learn_views.add, name='add'), # new
注:
name=‘add’ name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
简单的理解就是:
url(r'new_add/<int:a>/<int:b>/'', learn_views.add2, name='add2'),
注意看重点 add 变成了 new_add,但是后面的 name=‘add2’ 没改,这时 {% url ‘add2’ 4 5 %} 就会渲染对应的网址成 /new_add/4/5/
在网页模板中也是一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代码渲染成最终的页面是
<a href="/new_add/4/5/">link</a>
想要改网址的时候,修改 urls.py 中的正则表达式部分(url 参数第一部分),name 不变的前提下,其它地方都不需要修改。
比如用户收藏夹中收藏的URL是旧的,如何让以前的 /add/3/4/自动跳转到现在新的网址呢?
要知道Django不会帮你做这个,这个需要自己来写一个跳转方法:
具体思路是,在 views.py 写一个跳转的函数:
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
urls.py中:
url(r'^add/(\d+)/(\d+)/$', learn_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', learn_views.add2, name='add2'),
这样,假如用户收藏夹中有 /add/4/5/ ,访问时就会自动跳转到新的 /new_add/4/5/ 了
6.1.3打开开发服务器并访问:
python manage.py runserver 8002
默认端口是 8000,上面使用了自定义端口 8002
如果提示 Error: That port is already in use. 我们可以在后面加上端口号8001,8888等
6.1.4用浏览器浏览:
打开网址:http://127.0.0.1:8002/add/ 就可以
6.1.5给a和b传值:
我们在后面加上 ?a=4&b=5,即访问 http://127.0.0.1:8002/add/?a=4&b=5
6.2.采用 /add/3/4/ 这样的网址的方式
6.2.1修改 mysites/learn/views.py文件:(新定义一个add2 函数)
def add2(request, a, b):
c = int(a) + int(b)
return HttpResponse(str(c))
6.2.2修改 mysites//urls.py 文件:(添加一个新的网址)
path('add/<int:a>/<int:b>/', learn_views.add2, name='add2'),
6.2.3打开开发服务器并访问:
python manage.py runserver 8002
默认端口是 8000,上面使用了自定义端口 8002
如果提示 Error: That port is already in use. 我们可以在后面加上端口号8001,8888等
6.2.4用浏览器浏览:
打开网址:http://127.0.0.1:8002/add/ 就可以
6.2.5给a和b传值:
我们在后面加上4/5/,即访问 http://127.0.0.1:8002/add/4/5/
七、访问网页
7.1打开开发服务器并访问:
python manage.py runserver 8002
默认端口是 8000,上面使用了自定义端口 8002
如果提示 Error: That port is already in use. 我们可以在后面加上端口号8001,8888等
7.2用浏览器浏览:
打开网址:http://127.0.0.1:8002/learn/ 就可以