介绍:
Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
Django 是一个开放源代码的 Web 应用框架,由 Python 编写的。
Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0
Django 采用了 MVT 的软件设计模式,即模型(Model),模板(Template) 和 视图(View)
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
Django的MVT模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MVT分别是指:
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MVT的响应模式如下所示:
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
在终端内使用如下命令创建:
django-admin startproject mysite
此时mysite项目的目录结构如下:
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py # Django项目配置
├── urls.py # 路由(设置url对应视图函数)
└── wsgi.py
建立项目
首先我们进入刚刚创建的Django项目内
cd mysite
使用以下命令创建app项目:
python manage.py startapp blog
如果出现以下错误:
打开file后面指向的文件路径,然后根据Python提示的行152,去掉该行后面的一个逗号即可解决!
启动Django项目
python manage.py runserver 8080
blog
├── __init__.py
├── admin.py # 后台管理文件(后续详细了解)
├── apps.py
├── migrations # 主要作用于数据迁移(后续详细了解)
│ └── __init__.py
├── models.py # 模型文件(后续详细了解)
├── tests.py
└── views.py # 视图文件(后续详细了解)
通常我们还会在app项目内创建一个templates文件夹,用于存放HTML文件。
mkdir templates
然后在settings文件将我们的app项目路径配置一下(不然django不带这个blog项目玩了):
还需要将我们的templates模板文件夹路径配置一下:
上序做完我们才算做完了django的基本配置,然后就可以开始写我们的app项目了。
但是略有些麻烦,如果pycharm创建django项目的话,这些是由pycharm帮助我们弄的。
urls.py文件也可以称之为:路由。
作用:将用户输入的URL对应到视图里进行处理
urls.py
from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index), # 用户输入在页面后输入index,将请求交给views视图里的index函数处理
]
templates/index.html文件
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>indextitle>
head>
<body>
<h1>{{ data }}h1>
body>
html>
{{ data }}定义一个模板语法名称,允许使用特定方法向这个模板语法传值。
views.py
from django.shortcuts import render
# Create your views here.
def index(request): # request接收用户请求
'''可以有针对请求的处理过程,我们后续详细了解'''
return render(request,'index.html',context={'data':'Index首页'})
render函数必须传递的内容:
至于context的话,如果HTML文件需要Python传入内容进去,其过程如下:
模板语法内定义的名称
作为key,再定义我们需要传递给它的value。然后我们运行Django项目,在manage.py文件的目录:
python manage.py runserver 8080
结合一个给定的模板和一个给定的上下文字典, 并返回一个渲染后的HttpResponse对象。
参数:
实例:未使用render前渲染模板
from django.shortcuts import render,HttpResponse,redirect
from django.template import loader
# Create your views here.
def index(request):
template = loader.get_template('index.html')
data = template.render({'data':'Index首页'},request)
return HttpResponse(data)
上面写法等同于下面:
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def index(request):
return render(request,'index.html',{'data':'Index首页'})
返回一个字符串数据类型
views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def index(request):
return HttpResponse('这是一个字符串')
作用主要是需求达到某一目的后,重定向到某个位置。如:登录成功后,重定向到主页。其实也可以理解为跳转,但它是服务端执行的跳转,与点击链接跳转不同:一个被动、一个主动。
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def index(request):
return redirect('http://www.baidu.com/')
目前可以理解:Django视图函数必须要返回一个HttpResponse对象
render方法解析:其本质就是将页面内容进行一番渲染,然后页面内容拿到的就是一堆字符串放入HttpResponse进行返回。
redirect:
它与HttpResponse对象有些相似,但它主要作用是直接给页面返回JSON格式数据。
不需要它我们是否可以给页面返回JSON格式数据呢?答案也是可以的
方式一:自己序列化
views.py
from django.shortcuts import render,HttpResponse
import json
def index(request):
dic = {'name':'杰克','age':123}
dic_json = json.dumps(dic,ensure_ascii=False) # 不需要将中文转换成ascii码
return HttpResponse(dic_json)
第二种方式:JsonResponse序列化,并返回到页面
from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
def index(request):
dic = {'name':'杰克','age':123,'bool':True}
# JsonReponse也会将中文转换成ascii,所以我们要追加参数让它不要多管闲事!
return JsonResponse(dic,json_dumps_params={'ensure_ascii':False})
JsonResponse返回数据不支持传递其它数据类型,如:list、set、tuple、str、int等等
from django.http import JsonResponse
def index(request):
lis = [1,2,3,4,5]
return JsonResponse(lis)
浏览器打开直接报错:
浏览器给的提示:为了允许序列化非dict对象,请将safe参数设置为False。
就是让我们在JsonResponse增加一个safe参数并设置为False
from django.http import JsonResponse
def index(request):
lis = [1,2,3,4,5]
return JsonResponse(lis,safe=False)
静态文件也就是:不会自动发生变动的文件,一但写好,基本固定不会变动。
通常我们会在app项目下建立一个名为:static的文件夹,它主要用于保存模板所需内容,如:css文件、js文件、图片文件、第三方框架文件等等
此时我们的目录结构:
mysite # 存放django工程的文件夹
├── blog # app项目
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── static # 存放静态文件的地方
│ ├── templates # 模板
│ │ └── index.html
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
此时创建好了static文件夹后,还需要在settings.py里进行配置
STATIC_URL:访问静态文件的接口
STATICFILES_DIRS:使用接口可以访问的静态文件
然后我们就可以在static文件夹内建立:css文件夹、js文件夹、img文件夹。各自用于保存相关文件
static
├── css # 专注于存放css文件
├── img # 专注于存放图片文件
└── js # 专注于存放JS相关文件
└── 第三方框架文件夹等等
笔者在static文件夹内放入了web框架bootstarp的文件夹,在HTML中导入的方法如下:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>indextitle>
<link rel="stylesheet" href="../static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="../static/bootstrap-3.3.7-dist/js/bootstrap.min.js">script>
head>
<body>
<table class="table table-hover table-striped">
<tr>
<td>1td>
<td>2td>
<td>3td>
tr>
table>
body>
html>
这种方法导入对于本地而言是没有问题的,如果当我们开启django后,那它就是以:http://ip+端口/静态文件访问接口/静态文件...
所以我们在导入静态文件的时候,路径前缀一定要和settings.py里面的STATIC_URL一致。
<link rel="stylesheet" href="/静态文件接口/bootstrap-3.3.7-dist/css/bootstrap.min.css">
STATIC_URL = '/static/' 静态文件接口
但此时也产生了一个问题,如果我们的STATIC_URL改动的话,所有HTML文件导入静态文件的路径也要随着改变,所以我们需要HTML文件动态加载STATIC_URL。
在HTML内导入静态文件的方式修改为模板语法:
{% load static %}