一、Django简介
- 简介图
http服务器:用来接受用户请求,并将请求转发给web应用框架进行处理。
Web应用框架处理完以后再发送给http服务器,http服务器再返回给用户。
- 工具准备
为什么要用虚拟环境?
一个项目对应一个虚拟环境,多个项目可以创建多个虚拟环境。
二、环境搭建
一、创建虚拟环境及安装django
查看当前有哪些虚拟环境: workon
创建虚拟环境: mkvirtualenv -p /usr/bin/python3 envname
进入虚拟环境: workon envname
退出虚拟环境: deactivate
删除虚拟环境: rmvirtualenv envname
安装django : pip install django
查看当前python环境下的第三方库: pip list
新建项目的命令: django-admin startproject projectname
在虚拟机下执行:python manage.py runserver 0.0.0.0:8000
二、主文件介绍
manage.py django中的一个命令行工具,管理django项目。
_ init _.py 空文件,告诉python这个目录是python包。
setting.py 配置文件,包含数据库信息,调试标志,数据库连接、静态环境拼接等。
urls.py Django项目的URL声明,都是通过这个路由去访问。URL配置(URLconf)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于那个URL调用那段代码。url的加载就是从配置文件中开始
wsgi.py 部署服务器用到的。
三、pycharm内环境配置
如果报错:That port is alredy in use,解决办法如下:
在Linux虚拟机下输入:ps -aux|grep python
可以看到当前有哪些服务正在启动。找到runserver对应的编号,输入:kill -9 bianhao
即可正常运行。
四、创建视图函数
在主文件下New一个PythonFile命名为views
视图函数括号内一定要加上request(向服务发送请求)。在urls.py中进行配置后就能通过访问路由调用视图函数。
只有当输入的url跟后台配置的url一致才会调用url对应的视图函数。
五、项目与应用APP的关系
创建APP有两种方法
- 在虚拟机内输入命令:
python manage.py startapp app_name
- 在pycharm中的Tools中打开Run manage.py输入:
startapp app_name
创建后都要在pycharm中下载
最后要在settings里面的INSTALLED_APPS里进行注册
三、url路由分配
一、URL格式
schema://host[:port#]/path/…/[?query-string][#anchor]
schema:指定使用的协议(例如:http, https, ftp)
host:Http服务器的IP地址或者域名
port:端口号,http默认是80端口
path:访问资源的路径
query-string:发送给http服务器的数据
anchor:锚点
二、path和re_path
1、path的基本规则:path('test/<xx>/',views.test)
使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type)没有转化器,将匹配任何字符串,当然也包括了 / 字符。当前面的url匹配成功后,就会调用后面的视图函数。
<>内可以传递参数,根据视图函数内(用字符串拼接)的参数传递
可以传递一个值:
def index(request,name,count):
return HttpResponse('%s这是第%s节课'%(name,count))
#urls.py代码
path('index/<name>&<count>',views.index)
2、默认支持的转换器
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符
在参数前加,表明只能使用这样的数据格式:
def index(request,name,count):
return HttpResponse('%s这是第%s节课'%(name,count))
#urls.py代码
path('index/<name>&<int:count>',views.index) #count就只能输入int类型
3、re_path正则匹配
re_path(r'^hello/$',views.test5),
re_path(r'^hello/(?P<yy>[0-9]+)/',views.test6),
一般使用path
三、几个关键字的作用
1、include的作用
一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py,用include()函数在project的urls.py文件进行注册
- 在主路由下导入分路由
from django.urls import path,include
- 在主路由下进行拼接
path('book/',include('book.urls'))
配置文件以及部署,都是在主项目下进行
2、kwargs(不定长参数)的作用
传递一个Python 字典作为额外的参数传递给视图函数。(传递后视图函数必须要接收)
Kwargs为字典类型,可以传递额外的参数到views中使用include的时候,需要统一给主路由下面的url一些参数的时候显得尤其有用(直接在分配路由下传即可,就不需要在每个视图函数下写重复的代码)
#views.py
def index(request,**kwargs):
if kwargs.get('switch') == 'true':
print(datetime.datetime.now())
return HttpResponse('这个book的首页!!')
#urls.py下
path('book/',include('book.urls'),{
'switch':'true'}),
3、name的作用
name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。
给一个匹配的url地址取名字。一般用于模板,也可以使用reverse进行页面重定向
页面重定向:
页面重定向有两种方法:
- 换路径
# book/url.py APP books里面的URL文件
from django.conf.urls import path
from . import views
urlpatterns =[
path('article/', views.article),
]
# book/views.py APP book里面的view文件
from django.shortcuts import render,reverse,redirect
from django.http import HttpResponse
def article(request,**kwargs):
if kwargs.get('switch') == 'true':
return redirect('/article/new')
return HttpResponse('这是老文章')
- 用name
# book/url.py APP books里面的URL文件
from django.conf.urls import path
from . import views
urlpatterns =[
path('article/', views.article,name='books_article'),
]
# book/views.py APP book里面的view文件
from django.shortcuts import render,reverse,redirect
from django.http import HttpResponse
def article(request,**kwargs):
if kwargs.get('switch') == 'true':
return redirect(reverse('book_article_new'))
return HttpResponse('这是老文章')
四、Django模板
一、模板路径配置
Django怎样去调用HTML前端页面呢?
调用模板
模板放在哪?有以下两种方式:
- 在主目录下创建一个templates目录用来存放所有app的html的模板文件。(一定要在主项目中setting.py中app里进行注册)
- templates目录里面在新建各个以app名字命名的目录来存放各个app中模板文件。(需要配置模板路径)
第一种: DIRS 定义一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。将templates放在主项目目录下.
第二种: APP_DIRS告诉模板引擎是否应该进入每个已安装的应用中查找模板,值为True则模板会去安装了的app下面的templates文件夹查找模板。。所以我们也可以在每个app的里面创建模板目录templates存放模板,这种方式需要将这个app添加到setting.py文件的INSTALLED_APPS列表中.
一般使用1,在主目录下创建templates
判断文件是模板还是一个html文件只需要注释一下。HTML:<-- -->,模板文件:{# #}
1、模板路径
setting.py中模板路径配置:
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',
],
},
},
]
2、渲染方式
- 直接将html字符串硬编码HttpResponse中
def index_1(request):
return HttpResponse('<h1>Hello Django World!</h1>')
- django.template.loader 定义了函数以加载模板。
get_template(template_name,using = None)
该函数使用给定的名称加载模板并返回一个Template 对象.get_template()尝试获取每个模板直到有一个成功满足。
from django.template.loader import get_template
def index_2(request,bn):
t = get_template('index.html') #获取模板
html = t.render({
'books_name':bn}) #渲染页面
return HttpResponse(html) #返回
- 使用render进行渲染。(最快)
from django.shortcuts import render
def index_3(request,bn):
return render(request,'index.html',{
'booksname':bn})
二、模板变量
1、模板变量使用规则:
向前端传递数据都是键值对的形式,通过键获取值。键是唯一的,值不唯一。
1.语法: {
{ 变量名 }}
2.命名由字母和数字以及下划线组成,不能有空格和标点符号
3.可以使用字典、模型、方法、函数、列表
4.不要和python或django关键字重名
5.变量和查找
注:
1.如果data是一个字典,那么访问data.items将会访问data这个字典的key名为items的值,而不会访问字典的items方法。
2.点在模板渲染时有特殊的含义。 变量名中点表示查找。具体一点,当模板系统遇到变量名中的一个点时,它会按下面的顺序进行查找:字典查找,属性查找,列表索引查找。
# books/views.py
def hello():
return 'django'
class Fruits:
def __init__(self, name, color):
self.name = name
self.color = color
def say(self):
return 'HAHAHAHA'
ap = Fruits('apple','red') #实例化
ls = ['x','y','z']
dc = {
'a':1,'b':2}
from django.shortcuts import render
def index_5(request,bn):
return render(request,'books/index.html', #渲染
context={
'books_name':'python',#字符串
'hello':hello, # 函数
'fruits_say':ap.say, # 方法
'fruits':ap, # 类对象
'list':ls, # 列表
'dict':dc, # 字典
})
模板下的代码:
{
# /templates/books/index.html #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
这个变量是字符串对象:{
{
books_name}}<br>
这个变量是函数对象:{
{
hello}}<br>
这个变量是类方法对象:{
{
fruits_say}}<br>
这个变量是类对象:{
{
fruits}}<br>
这个变量是类对象,访问类对象的属性:{
{
fruits.name}}<br>
这个变量是类对象,访问类对象的方法:{
{
fruits.say}}<br>
这个变量是列表对象{
{
list }}<br>
这个变量是列表对象,访问列表的元素{
{
list.1 }}<br>
这个变量是字典对象{
{
dict }}<br>
这个变量是字典对象,访问字典的键{
{
dict.a }}<br>
</body>
</html>
三、模板过滤器
作用: 对变量进行过滤。在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来。
语法:{
{fruits|lower}}
管道符号进行链式调用,比如实现一个功能,先把所有字符变成小写,把第一个字符转换成大写。
语法:{
{fruits|lower|capfirst}}
使用参数:过滤器可以使用参数,在过滤器名称后面使用冒号”:”再加上参数,比如要把一个字符串中所有的空格去掉,则可以使用cut过滤器。语法如下: {
{fruits|cut:" "}}
过滤器参数,可以使用变量,字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串。
注:使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着。
1、常用过滤器
1、 add :字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串。
2、default:提供一个默认值,在这个值被django认为是False的时候使用。比如:空字符串、None。区别于default_if_none,这个只有在变量为None的时候才使用默认值。
3、first:返回列表中的第一个值。
4、last:返回列表中的最后一个值。
5、date:格式化日期和时间。
6、time:格式化时间。
7、join:跟python中的join一样的用法。
8、length:返回字符串或者是数组的长度。
9、length_is:字符串或者是数组的长度是否是指定的值。
10、lower:把所有字符串都编程小写。
11、truncatechars:根据后面给的参数,截断字符,如果超过了用…表示。
12、truncatewords:同truncatechars,这个是以一个单词为单位进行截断。
以上两个有xxx_html类型的,针对html,截断标签中的字符,而不会截断标签。
13、capfirst:首字母大写。
14、slice:切割列表。用法跟python中的切片操作是一样的,区间是前闭合后开放。
15、striptags:去掉所有的html标签。
16、safe:关闭变量的自动转义
17、floatformat:浮点数格式化。
2、date和time过滤器格式
Y:四位数的年。如:1999
y:两位数的年。如:99
m:两位数的月。如:01,09
n:一位数的月。如:1,9,12
d:两位数的日。如:01,09,31
j:一位数的日。如:1,9,31
g:12小时制的一位数的小时。如:1,9,12
G:24小时制的一位数小时。如:0,8,23
h:12小时制的两位数的小时。如:01,09,12
H:24小时制的两位数的小时。如:01,13,24
i:分钟。从00-59
s:秒。从00-59
默认为美国时间,如果要改地区时差就在主目录下的settings里面改
3、自动转义
自动转义是将变量的一些特殊字符,比如左箭头(<)、右箭头(>)转义成html代码,这样做的目的是为了处理一些不安全的变量。
<:转义成<
>:转义成>
‘:转义成'
“:转义成"
&:转义成&
取消自动转移用safe:{
{ html|safe }}
过滤器例子:
新建一个名为movie的APP。
# movie/views.py
from django.shortcuts import render
from datetime import datetime
ls = ['x','y','z']
def hello(request):
test = 'THIS IS A LIST!'
return render(request,'movie/home.html',
context={
'test':test,
'xx':'',
'num1':1,
'num2':2,
'list':ls,
'now':datetime.now,
'html':'<h1>hello django!!!</h1>',
'float':3.1415926,
})
模板下的代码:
{
# /templates/movie/index22.html #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset=