1. 路由
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/$', views.index),
]
#
def index(request):
pass
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/(\d+)/$', views.index),
]
#
def index(request, id):
pass
-
分组命名
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/1/2/3/4/5/6/$', views.index, name=n1),
]
#
from django.urls import reverse
def index(request):
print(reverse(n1))
>>>
/index/1/2/3/4/5/6/
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/1/2/3/4/5/6/(\d+)/$', views.index, name=n2),
]
#
from django.urls import reverse
def index(request, n2):
print(reverse(n2), args=(10,))
print(reverse(n2), args=(20,))
>>>
/index/1/2/3/4/5/6/10/
/index/1/2/3/4/5/6/20/
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/1/2/3/4/5/6/(?P<id>\d+)/$', views.index, name=n3),
]
#
from django.urls import reverse
def index(request, n3):
print(reverse(n3), kwargs={'id':100})
print(reverse(n3), kwargs={'id':200})
>>>
/index/1/2/3/4/5/6/100/
/index/1/2/3/4/5/6/200/
-
路由分发
from django.conf.urls import url, include
urlpatterns = [
url(r'index/$', include('index.urls'))
url(r'home/$', include('home.urls'))
]
from django.conf.urls import url, include
urlpatterns = [
url(r'index/$', include('index.urls', namespace='index')),
url(r'home/$', include('home.urls', namespace='home')),
]
2. 视图
-
请求相关(request)
-
POST
-
GET
-
-
mothed
-
body
-
cookie
-
session
-
...
-
业务逻辑
-
响应相关(response)
-
render
-
HttpResponse
-
redirect (只有相应头,没有响应体)
-
JsonResponse
-
...
3. 模版
{# 注释信息 #}
{{ 变量名 }}
{{ var|filter_name:param }}
-
标签 (if/for/with/csrf_token/...)
{% tag %}
...
{% endtag%}
{% extends 'base.html' %}
{% block block_name %}
...
{% endblock %}
{% include 'public.html' %}
{% load STATIC_NAME %}
<img src="{% STATIC_NAME"images/img.jpg"%}" alt=""/>
#
{% load STATIC_JS %}
{% STATIC_JS "js/myjs.js" as MYJS %}
<script src="{{ MYJS }}"></script>
#
#
{% load STATIC_NAME %}
<img src="{% get_static_prefix"images/img.jpg"%}" alt=""/>
#
{% load STATIC_NAME %}
{% load get_static_prefix as STATIC_PRE %}
<img src="{{ STATIC_PRE }}images/img1.jpg" alt=""/>
<img src="{{ STATIC_PRE }}images/img2.jpg" alt=""/>
-
自定义过滤器
-
-
任意创建一个py文件
-
导入Library
-
实例化register
-
定义函数(加装饰器@register.filter或@register.simple_tag)
-
使用
from django.template import Library
register = Library()
@register.filter
def aaa(a1,a2):
a3,a4 = a2.split(',')
data = "我是%s,我有%s和%s" %(a1, a3, a4)
return data
@register.simple_tag
def bbb(a1,a2,a3,a4):
result = a1+a2+a3+a4
return result
@register.filter
def ccc(a1):
if 'yy' in a1:
return True
return False
4. cookie和session
5. 中间件
-
概念:Django的中间件是一个类
-
继承MiddlewareMixin基类
-
请求方法:process_request
-
如果请求有返回值,则执行自己的response和以上的response
-
如果没有返回值,则继续往下运行
-
相应方法:process_response,必须设置返回值
-
定义:针对所有请求做统一操作时,使用中间件来管理,如果对少量的视图做操作时,可以使用装饰器
-
应用案例:
-
使用中间件实现登录验证功能
创建文件:app01/middleware/auth.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.middleware.auth.AuthMiddleware',
]
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^login/$', views.login),
url(r'^index/$', views.index),
url(r'^home/$', views.home),
]
from django.shortcuts import render, HttpResponse, redirect
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'aaa' and pwd == '123':
request.session['user_info'] = {'id': 1, 'url': 'home'}
return redirect('/home/')
return render(request, 'login.html')
def index(request):
return HttpResponse('首页')
def home(request):
return HttpResponse('个人页面')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登录页面</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>
<label for="">
用户名:
<input type="text" name="user">
</label>
</p>
<p>
<label for="">
密码:
<input type="password" name="pwd">
</label>
</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
# 访问登录页面和首页时不需要做验证,直接return None继续往下执行
if request.path_info == '/login/' or request.path_info == '/index/':
return None
# 获取session,登录成功之后才能跳转到个人页面,否则继续留在登录页面
user_info = request.session.get('user_info')
if not user_info:
return redirect('/login/')
def process_response(self, request, response):
return response