一、基础介绍
1.1、安装 pip3 install django
1.2、创建一个名为:crazyjump的django项目:django-admin startproject crazyjump
1.3、目录介绍:
crazyjump/
├── manage.py # 管理文件
└── crazyjump # 项目目录
├── __init__.py
├── settings.py # 配置文件
├── urls.py # 路由 --> URL和函数的对应关系
└── wsgi.py # runserver命令就使用wsgiref模块做简单的web server
1.4、运行Django项目:python manage.py runserver 127.0.0.1:8000
1.5、模板文件和静态文件配置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], #模板文件夹名称及目录路径
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀名称
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放具体位置
]
刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试
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',
]
1.6、Django返回前端三连:
from django.shortcuts import HttpResponse, render, redirect
#返回字符串
def index(request):
return HttpResponse("OK")
#返回模板渲染
def index(request):
userlist=[{"id":1,"age":12}]
return render(request,"index.html",{'userlist':userlist})
#跳转
def index(request):
return redirect("http://www.baidu.com")
二、Django框架了解
2.1、简介
MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
2.2、APP
一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码
#命令创建(对应项目manage.py目录下)
python manage.py startapp cmdb
三、路由系统
3.1、基本格式
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
#参数说明
正则表达式:一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数
3.2、正则表达式详解
元字符 | 匹配内容 |
\w | 匹配字母(包含中文)或数字或下划线 |
\W | 匹配非字母(包含中文)或数字或下划线 |
\s | 匹配任意的空白符 |
\S | 匹配任意非空白符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\A | 从字符串开头匹配 |
\z | 匹配字符串的结束,如果是换行,只匹配到换行前的结果 |
\Z | 匹配字符串的结束 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中的字符的所有字符 |
* | 匹配0个或者多个左边的字符。 |
+ | 匹配一个或者多个左边的字符。 |
? | 匹配0个或者1个左边的字符,非贪婪方式。 |
{n} | 精准匹配n个前面的表达式。 |
{n,m} | 匹配n到m次由前面的正则表达式定义的片段,贪婪方式 |
a|b | 匹配a或者b。 |
() | 匹配括号内的表达式,也表示一个组 |
#url:
from jump import views
urlpatterns = [
url(r'detali/(\d+).html/', views.detali),
url(r'^userdel/(?P<nid>\d+)', views.userdel),
#(?P<...>\..) 分组匹配固定模式{k:v}
url(r'^', views.error),
]
#view:
def detali(request,n1):
#n1为(\d+)匹配参数
pass
def userdel(request,nid):
#nid 为(?P<nid>\d+)匹配参数
pass
def error(request):
#匹配找不到url的页面
pass
注意点:
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)
- 不需要添加一个前导的反斜杠,因为每个URL 都有,例如,应该是^articles 而不是 ^/articles
- 每个正则表达式前面的'r' 是可选的但是建议加上
路由分发:
from django.conf.urls import url, include
urlpatterns = [
url(r'^cmdb/', include("cmdb.urls")),
url(r'^host/',include("host.urls")),
]
传递额外的参数给视图函数:
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
url(r'^manage/(?P<name>\w*)', views.user,{'id':123}),
def user(request,id)
pass
3.3、为路由设置名称
url(r'^home', views.home, name='home'), # 给我的url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index
这样在模板里面可以这样引用:
{% url 'home' %}
<form method="POST" action="{% url "m1" %}">
在views函数中可以这样引用:
from django.urls import reverse v=reverse("index", args=("2018", )) #反生成url,args为设定匹配的参数,分组匹配用kwargs
四、视图系统
4.1、Dganjo的视图
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。(响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片)
简单的示例:
from django.shortcuts import render,redirect,HttpResponse
def index(request):
return HttpResponse("我的相应")
4.2、FBV和CBV
from django.views import View
from django.shortcuts import render,redirect,HttpResponse
#FBV
def index(request):
if request.method == "POST":
return redirect("https://www.baidu.com")
return render(request, "index.html")
#CBV
# urls.py中
url(r'^index.html/$', views.Index.as_view()),
class Index(View):
def get(self, request):
return render(request, "index.html")
def post(self, request):
return redirect("https://www.baidu.com")
CBV补充:
#使用CBV时要注意,请求过来后会先执行dispatch()这个方法,可用此来做钩子,类似给方法加上装饰器
class Login(View):
def dispatch(self, request, *args, **kwargs):
#重写View中的dispatch方法
print('before')
obj = super(Login,self).dispatch(request, *args, **kwargs)
print('after')
return obj
def get(self,request):
return render(request,'login.html')
def post(self,request):
print(request.POST.get('user'))
return HttpResponse('Login.post')
补充:CBV和FBV的装饰器
#FBV装饰器
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
return ret
return inner
@wrapper
def fun(request):
return render(request, "add.html")
#CBV装饰器
from django.views import View
from django.utils.decorators import method_decorator #固定格式
@method_decorator(wrapper) #给全部加
class AddClass(View):
@method_decorator(wrapper) #给get加
def get(self, request):
return render(request, "add.html")
def post(self, request):
return render(request,"xxx.html")
4.3、补充:Request对象
当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象
请求相关的常用值:
- path_info 返回用户访问url,不包括域名
- method 请求中使用的HTTP方法的字符串表示
- GET 包含所有HTTP GET参数的类字典对象
- POST 包含所有HTTP POST参数的类字典对象
- body 请求体,byte类型 request.POST的数据就是从body里面提取到的
上传文件
def upload(request):
"""
保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
"""
if request.method == "POST":
# 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
filename = request.FILES["file"].name
# 在项目目录下新建一个文件
with open(filename, "wb") as f:
# 从上传的文件对象中一点一点读
for chunk in request.FILES["file"].chunks():
# 写入本地文件
f.write(chunk)
return HttpResponse("上传OK")
五、Django模板系统(templates)
5.1、常用语法
{{ }}和 {% %},变量相关的用{{ }},逻辑相关的用{% %}
5.2、变量过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写
注意事项:
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
- '|'左右没有空格没有空格没有空格
Django的模板语言中提供了大约六十个内置过滤器
#default 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。
#如果value没有传值或者值为空的话就显示nothing
{{ value|default:"nothing"}}
#length返回值的长度,作用于字符串和列表
{{ value|length }}
#将值格式化为一个 “人类可读的” 文件尺寸
{{ value|filesizeformat }}
#切片
{{value|slice:"2:-1"}}
#过滤器“|safe”的方式告诉Django这段代码是安全的不必转义
{{ value|safe}}
#移除value中所有的与给出的变量相同的字符串
{{ value|cut:' ' }}
#在一定数量的字后截断字符串
{{ value|truncatewords:9}}
5.3、标识
#for循环
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
#if判断
{% if user %}
{{代码内容}}
{% else %}
{{代码内容}}
{% endif %}
#if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断
#{% csrf_token %}这个标签用于跨站请求伪造保护。
#在页面的form表单里面写上{% csrf_token %}
补充:自定义simple_tag和filter
#在settings中配置当前app,不然django无法找到自定义的simple_tag和filter
#在app中创建templatetags目录
#创建任意 .py 文件,如:xx.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #固定写法
#simple_tag
@register.simple_tag
def my_simple_tag(v1,v2,v3):
return v1 + v2 + v3
#
@register.filter
def my_filter(x,y)
return x+y
#在使用自定义的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
{% my_simple_time 1 2 3%}
{{name|my_filter:2}} #name为设定好的值(形参为x)
#simple_tag (参数任意,不能if条件)
#filter (最多参数2个,if条件){% if name|my_filter:2 > 100 %}{%endif%}
5.4、模板继承
#通过在母板中使用{% block name %}来定义"块"
#在子页面中在页面最上方使用下面的语法来继承母板。
{% extends 'base.html' %}
{% blocak name %}
代码内容
{% endblocak %}
#可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可
{% include 'base.html' %}