0. 上节关键命令
创建一个 Django 项目: django-admin startproject projectname
创建一个项目下的应用: python3 manage.py startapp appname
运行: python3 manage.py runserver (IP PORT)
1.url 配置(URLconf)
功能: 建立起 url 与视图函数的映射关系. 通过这种方式告诉 django, 客户端发来的某个 url 调用哪一段逻辑代码对应执行
基本语法: url(正则表达式规则, 视图函数)
url 下的 path 是 django2.0 的语法, re_path 属于 1.0 的语法, 目前 2.0 也兼容这种语法, 导入即可
url 部分
- urlpatterns = [
- # 用户在 url 中输入 127.0.0.1:8000/articles/2003/, 可以直接调用函数
- url(r'^articles/2003/$', views.special_case_2003),
- # 利用优先匹配, 获取用户输入年月
- url("^articles/(\d{4})/(\d{2})/$", views.article_month),
- # 什么都不写也会默认访问这一个 index 视图, 这个也很重要
- url(r'^$', views.index),
- ]
views 部分
- from django.shortcuts import render,HttpResponse,redirect
- from django.urls import reverse
- # Create your views here.
- def special_case_2003(request):
- return HttpResponse('get it')
- def article_month(request,year,month):
- print(year, type(year))
- print(month, type(month))
- return HttpResponse(year + ":" + month)
- def index(request):
- return HttpResponse('首页默认显示')
注:
若要在 url 中捕获一个值, 只需要在他周围防止一对圆括号, 如上例
不需要添加一个前导的反斜杠, 因为每个 URL 都有. 例如, 应该是 ^articles 而不是 ^/articles.
每个正则表达式前面的'r' 是可选的但是建议加上. 它告诉 Python 这个字符串是 "原始的" -- 字符串中任何字符都不应该转义
1.2 有名分组
上面简单配置只是通过简单配置来捕获 URL 中的值, 并通过位置参数传给视图, 可以使用命名的正则表达式组来捕获 URL 中的值并以关键字参数传递给视图.
url 部分
- from django.conf.urls import url
- from app import views
- # 有名分组
- urlpatterns = [
- url("^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$",views.article_day)
- # article_year(request,year=2000,month=12,day=12)
- ]
views 部分
- from django.shortcuts import render,HttpResponse,redirect
- from django.urls import reverse
- # 这里形参无论怎么放置都无所谓了
- def article_day(request,month,day,year):
- return HttpResponse(year + "-" + month + "-" + day)
1.3 分发
首先需要引入一个函数 include(看 urls.py 下的注释), 当你存在多个 app 的时候, 彼此互不影响, 各自从各自的 app 中去查找, 好处是用于解耦
- from django.urls import path,include
- urlpatterns = [
- path('app01/',include("app01.urls")),
- path('app02/',include("app02.urls")),
- ]
1.4 反向解析(重要的一个功能)
url 下的名字由于业务需求领导要求变更, 这意味用到该路径的地方都需要更改, 模板中用到这个名字的地方都需要改, 一个项目中可能包含几十个模板文件, 此时意味着维护起来代价相当高, 此时则引入了反向解析这种语法, 通过使用别名 name 来提高代码的灵活性.
url 部分(不管怎么变动, 我们只需更改这里的 url 部分即可, 大大减少了工作量)
- from django.urls import path
- from app import views
- urlpatterns = [
- path("login/", views.login, name="log_in"),
- path("index/", views.index, name="index"),
- ]
视图部分
- from django.shortcuts import render,HttpResponse,redirect
- from django.urls import reverse # 导入反向解析的一个函数
- def login(request):
- if request.method == 'POST':
- user = request.POST.get('user')
- pwd = request.POST.get('pwd')
- if user=='bob' and pwd=='123':
- # 登录成功后直接跳转到首页 index, 即重定向,
- # 不过下面这样写就又被写死了, 如果 url 中一改这里也需要改动
- # 现在也需要通过在 url 下使用别名
- # return redirect("index") # 硬编码
- url = reverse("index") # 反向解析
- print("url", url) # url /index/
- return redirect(url)
- return render(request,"login.html")
- def index(request):
- return HttpResponse('跳转成功')
模板部分(login.html)
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- {# 注意这里内容必须要放在 form 表单里, 否则无法实现跳转 #}
- <form {% url 'log_in' %} method="post">
- 姓名:<input type="text" name="user">
- 密码:<input type="password" name="pwd">
- <input type="submit">
- </form>
- </body>
- </html>
注:
思路其实通过以不变 (别名 name) 应万变
在模板 (html 文件) 中:
{% url '别名' %}
在视图函数 (Python 脚本) 中:
- from django.urls import reverse
- url=reverse(别名)
来源: http://www.bubuko.com/infodetail-2656069.html