一起学习Django框架(一)简介、基本使用

目录

    • 一、MVC与MVT模型
      • 1.1 MVC
      • 1.2 MVT
    • 二、Django的下载与基本命令
      • 2.1下载Django
      • 2.2 创建Django项目
    • 三、基于Django实现的一个简单示例
      • 3.1 URL控制器
      • 3.2 模板
      • 3.3 视图
    • 四、Django常用的3个方法
      • 4.1 render
      • 4.2 HttpResponse
      • 4.3 redirect
      • 4.4 上序常用方法的本质
      • 补充:JsonResponse
        • 解决传递非dict类型数据报错
    • 五、Django静态文件
      • 5.1 配置方式
      • 5.2 动态解析静态接口


介绍:

  • Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。

  • Django 是一个开放源代码的 Web 应用框架,由 Python 编写的。

  • Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0

  • Django 采用了 MVT 的软件设计模式,即模型(Model),模板(Template) 和 视图(View)



一、MVC与MVT模型

1.1 MVC

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

一起学习Django框架(一)简介、基本使用_第1张图片


1.2 MVT

Django的MVT模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MVT分别是指:

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MVT的响应模式如下所示:
一起学习Django框架(一)简介、基本使用_第2张图片
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。



二、Django的下载与基本命令

2.1下载Django

  • 方式一:在命令界面使用pip安装

    pip install django==2.0
    
  • 方式二:使用pycharm安装

    一起学习Django框架(一)简介、基本使用_第3张图片


2.2 创建Django项目

在终端内使用如下命令创建:

django-admin startproject mysite

此时mysite项目的目录结构如下:

mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py # Django项目配置
    ├── urls.py # 路由(设置url对应视图函数)
    └── wsgi.py
  • manage.py —– Django项目里面的工具,通过它可以调用django shell和数据库等。
  • settings.py —- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py —– 负责把URL模式映射到应用程序。

建立项目

首先我们进入刚刚创建的Django项目内

cd mysite

使用以下命令创建app项目:

python manage.py startapp blog

如果出现以下错误:
在这里插入图片描述
打开file后面指向的文件路径,然后根据Python提示的行152,去掉该行后面的一个逗号即可解决!


启动Django项目

python manage.py runserver 8080

浏览器访问:
一起学习Django框架(一)简介、基本使用_第4张图片
此时我们app项目的目录结构:

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项目玩了):

一起学习Django框架(一)简介、基本使用_第5张图片
还需要将我们的templates模板文件夹路径配置一下:
一起学习Django框架(一)简介、基本使用_第6张图片
上序做完我们才算做完了django的基本配置,然后就可以开始写我们的app项目了。

但是略有些麻烦,如果pycharm创建django项目的话,这些是由pycharm帮助我们弄的。

一起学习Django框架(一)简介、基本使用_第7张图片


三、基于Django实现的一个简单示例

3.1 URL控制器

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函数处理
]

3.2 模板

templates/index.html文件

DOCTYPE html>
<html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>indextitle>
      head>
      <body>
        <h1>{{ data }}h1>
      body>
html>

{{ data }}定义一个模板语法名称,允许使用特定方法向这个模板语法传值。

3.3 视图

views.py

from django.shortcuts import render

# Create your views here.

def index(request): # request接收用户请求
	'''可以有针对请求的处理过程,我们后续详细了解'''
        return render(request,'index.html',context={'data':'Index首页'})

render函数必须传递的内容:

  1. request用户请求
  2. HTML文件

至于context的话,如果HTML文件需要Python传入内容进去,其过程如下:

  • 打开HTML文件,识别模板语法,如:{{ data }}
  • 使用context以字典形式传入值,根据模板语法内定义的名称作为key,再定义我们需要传递给它的value。
  • 再将HTML文件响应到浏览器。

然后我们运行Django项目,在manage.py文件的目录:

python manage.py runserver 8080

浏览器打开效果:
一起学习Django框架(一)简介、基本使用_第8张图片



四、Django常用的3个方法

4.1 render

结合一个给定的模板和一个给定的上下文字典, 并返回一个渲染后的HttpResponse对象。

参数:

  • request: 用于生成响应的请求对象
  • template_name: 要使用的模板的完整名称
  • context: 添加到模板上下文的一个字典. 默认是一个空字典. 如果字典中的某个值是- 可调用的, 视图将在渲染模板之前调用它.
  • content_type:  生成的文档要使用的MIME类型. 默认为DEFAULT_CONTENT_TYPE设置的值. 默认为"text/html"
  • status: 响应的状态码. 默认为200
  • useing: 用于加载模板的模板引擎的名称

实例:未使用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首页'})

4.2 HttpResponse

返回一个字符串数据类型

views.py

from django.shortcuts import render,HttpResponse,redirect
# Create your views here.

def index(request):
    return HttpResponse('这是一个字符串')

浏览器打开效果:
在这里插入图片描述

4.3 redirect

作用主要是需求达到某一目的后,重定向到某个位置。如:登录成功后,重定向到主页。其实也可以理解为跳转,但它是服务端执行的跳转,与点击链接跳转不同:一个被动、一个主动。

from django.shortcuts import render,HttpResponse,redirect
# Create your views here.

def index(request):
    return redirect('http://www.baidu.com/')

根据这种写法,打开浏览器后直接重定向到了百度:
一起学习Django框架(一)简介、基本使用_第9张图片

4.4 上序常用方法的本质

目前可以理解:Django视图函数必须要返回一个HttpResponse对象

render方法解析:其本质就是将页面内容进行一番渲染,然后页面内容拿到的就是一堆字符串放入HttpResponse进行返回。
一起学习Django框架(一)简介、基本使用_第10张图片
redirect:
一起学习Django框架(一)简介、基本使用_第11张图片

补充:JsonResponse

它与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)

浏览器打开效果:
一起学习Django框架(一)简介、基本使用_第12张图片

第二种方式: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})

打开浏览器效果:
一起学习Django框架(一)简介、基本使用_第13张图片

解决传递非dict类型数据报错

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)

再次浏览器打开效果:
在这里插入图片描述



五、Django静态文件

5.1 配置方式

静态文件也就是:不会自动发生变动的文件,一但写好,基本固定不会变动。

通常我们会在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里进行配置
一起学习Django框架(一)简介、基本使用_第14张图片

一起学习Django框架(一)简介、基本使用_第15张图片
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+端口/静态文件访问接口/静态文件...

一起学习Django框架(一)简介、基本使用_第16张图片
所以我们在导入静态文件的时候,路径前缀一定要和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。

5.2 动态解析静态接口

在HTML内导入静态文件的方式修改为模板语法:

{% load static %}


                    
                    

你可能感兴趣的:(Django,Django)