Django基础之:django下载安装以及简单使用

一、MVC和MTV框架

MVC

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

MTV

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

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

  除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

  

  一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

二、Django下载安装

 Django官网下载页面

1、下载Django:

1
pip3 install django==1.11.9

Django我们用的是1.11.9版本,大版本就是一版本,不要下载2版本。有一些功能是有差别的。

我们下载的类似于一个模块,借助这个模块我们可以创建项目,而不是直接下载了项目,一定要有所区分。

打开Django官网,我们介绍一下Django的历史:

1.11 是17年开始的,支持时间很长。2.2 也是长期支持的。

2、创建一个django project

创建Django项目不能用中文,我建议大家先创建一个Django_projects的文件夹,以后我们创建的jango项目全部放到这个文件夹中。接下来我们cd切换到这个目录下,创建第一个项目:

1
django-admin startproject mysite   创建了一个名为"mysite"的Django 项目:

 当你通过上面的命令创建一个项目时,你可能会遇到这样的错误:django-admin不是内部或者外部命令,这样是报错了,为什么? 为什么你输入python 输入pip都不回报错? python pip都是一个可执行程序,他的路径肯定是在环境变量中,所以我们要将django-admin.exe路径配置到环境变量中:

 如果你在上面路径找不到这个django-admin.exe,那么就通过下面的方式寻找:

通过pip安装的大部分模块一般都在lib>site-packages里面,在找到django-admin.exe以及django-admin.py两个文件,

  当前目录下会生成mysite的工程,目录结构如下:(大家注意昂,pip下载下来的django你就理解成一个模块,而不是django项目,这个模块可以帮我们创建django项目)

          

  • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库,启动关闭项目与项目交互等,不管你将框架分了几个文件,必然有一个启动文件,其实他们本身就是一个文件,类似于我们之前讲的start.py。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。
  • wsgi.py ---- runserver命令就使用wsgiref模块做简单的web server,后面会看到renserver命令,所有与socket相关的内容都在这个文件里面了,目前不需要关注它。

这里有的同学可能使用的是虚拟环境创建的项目,那么什么是虚拟环境?简单描述就是Python虚拟环境的主要目的是为了给不同的工程创建互相独立的运行环境。在虚拟环境下,每一个工程都有自己的依赖包,而与其它的工程无关。不同的虚拟环境中同一个包可以有不同的版本。并且,虚拟环境的数量没有限制,我们可以轻松地用virtualenv或者pyenv等工具来创建多个虚拟环境。

有关虚拟环境的两篇博客:

虚拟环境详细解释

虚拟环境的命令与图文解释

 python manage.py runserver 127.0.0.1:8080  # 此时已经可以启动django项目了,只不过什么逻辑也没有呢

3、创建应用 

  你会发现,上面没有什么view视图函数的文件啊,这里我们说一个应用与项目的关系,上面我们只是创建了一个项目,并没有创建应用,以微信来举例,微信是不是一个大的项目,但是微信里面是不是有很多个应用,支付应用、聊天应用、朋友圈、小程序等这些在一定程度上都是相互独立的应用,也就是说一个大的项目里面可以有多个应用,也就是说项目是包含应用的,它没有将view放到这个项目目录里面是因为它觉得,一个项目里面可以有多个应用,而每个应用都有自己这个应用的逻辑内容,所以他觉得这个view应该放到应用里面,比如说我们的微信,刚才说了几个应用,这几个应用的逻辑能放到一起吗,放到一起是不是就乱套啦,也不好管理和维护,所以这些应用的逻辑都分开来放,它就帮我们提炼出来了,提炼出来一个叫做应用的东西,所以我们需要来创建这个应用。

  通过django命令创建的项目:他认为你的项目我已经给你创建好包含(服务器相关应用以及url等)。但是你的应用逻辑需要自己完成。也就是说咱们的项目中必须创建应用。通过manage.py 可以创建应用。

python manage.py startapp blog   
# 通过执行manage.py文件来创建应用,执行这句话一定要注意,你应该在这个manage.py的文件所在目录下执行这句话,因为其他目录里面没有这个文件
python manage.py startapp blog2  
# 每个应用都有自己的目录,每个应用的目录下都有自己的views.py视图函数和models.py数据库操作相关的文件 # 上面我是在一个项目中创建了两个应用,就好比你创建微信项目,开启了聊天和摇一摇两个应用一样。

          

 我们现在只需要看其中两个文件

    models.py :之前我们写的那个名为model的文件就是创建表用的,这个文件就是存放与该app(应用)相关的表结构的

    views.py    :存放与该app相关的视图函数的

4、启动项目

python manage.py runserver 8080   
# python manage.py runserver 127.0.0.1:8080,本机就不用写ip地址了 如果连端口都没写,默认是本机的8000端口

       这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

       

学习Django,我们就学上面的这些文件,怎么在MTV+url分发的功能下来使用。

5、通过pycharm创建Django项目以及应用

 

 

最终你的目录结构就是这个样子:

三、基于Django项目实现简单的登录示例

接下来,我们基于Django项目实现一个简单的登录,将整个流程走通。

按照我们之前自己写的起飞版web项目,主要是两部分,服务器程序以及应用程序,在Django项目中服务器程序已经给我们封装好了,基本上学一些参数即可,比较容易,主要是应用程序,所以我们第一步先配置应用程序,应用程序的第一步在哪?启动项目,在浏览器输入ip端口,回车,这样服务端接收到路径根据不同的路径执行对应的函数,所以我们先配置路径url.

1、配置url

from app01 import views  # 必须引用views模块

urlpatterns = [
# url(r'^admin/', admin.site.urls),  这个路径拼接的admin组件,后面我们会讲到。
    url(r'^index/', views.login),
]

 

 

 

 这里是通过正则匹配匹配的路径,前面固定拼接的就是'127.0.0.1:8000',现在你这样写'/index/' ,后面映射的就是views.py视图函数的login,因为是正则匹配,所以如果你访问的是这样的路径:'http://127.0.0.1:8000/index/login/666',也是可以映射到此函数的,你要想完全匹配的话应该这样写:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    # url(r'^admin/', admin.site.urls),  这个路径拼接的admin组件,后面我们会讲到。
    url(r'^index$', views.login),
]

下面是django2.x版本的url写法,不太一样了,但是兼容1.x的,不过我们现在还是主要说1.xx版本的,所以写url的时候按照上的方式写。
from django.contrib import admin from django.urls import path
from app01 import views
#找对应的函数,是哪个app里面的函数
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls), #这个先不用管,后面会学
    path('index/',views.index),
]

这样通过浏览器只能输入http://127.0.0.1:8000/index此url才可以映射到login函数。

2、配置views视图函数

找到views文件,定义一个login函数,之前我们自己写的时候可以接受形参envison,现在我们可以设置任意形式参数,一般我们设置为request,request参数就包含了服务器程序的请求响应所有的参数提供给我们使用。

from django.shortcuts import render, HttpResponse
def login(request):
    print(request)  # <WSGIRequest: GET '/index'> 这是一个对象
    print(request.method)  # method方法返回的就是请求方式,本次请求就是get请求
    return HttpResponse('跑通了,好玩么?')  # 返回给页面一行字符串,一般都是测试是否跑通了。

那么如何返回一个html页面呢? 这里就需要引用另一个功能,就是render。之前jinja2有一个template通过render进行前后端渲染,现在django也给我们提供了一个render方法,可以给浏览器返回一个页面,并且能进行前后端的渲染。我们要完成的就是登录功能,所以我们下面写一个登录页面login.html。现在我们现在views文件中返回。

from django.shortcuts import render, HttpResponse
def login(request):
    return render(request,'login.html')  # 第一个参数必须是request参数,因为request包含的是服务器程序的请求与响应所有信息,所以你返回给谁也就是给谁响应都在request里面,第二个参数就是html页面。

3、配置template

接下来我们要完善html页面,再此之前我们需要配置一下template的路径,让django可以找到(有的默认已经配置好了)。

在settings文件中配置:

 

 

路径配置成功之后,我们写一个登录的页面。

<!DOCTYPE html>
<html lang="zh-CN">
<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>Bootstrap 101 Template</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">


</head>
<body>
<h1>欢迎访问xx系统,请先登录</h1>

<form action="/index/" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    提交:<input type="submit">
</form>
</body>
</html>

form表单两点注意:

  1. action路径 index前面一定要主动加上‘/’,如果你不主动加上/,则最终路径会给你拼接成:http://127.0.0.1:8000/index/index/

  2. form表单为什么用post提交数据?

  你访问页面以及form表单提交数据都是通过http://127.0.0.1:8000/index此url也就是说都必须执行login函数,如果都是get请求,那么login函数如何区分哪个get是请求页面哪个get是提交数据呢?所以要用post请求提交数据。

4、完善views视图函数

之前写的views视图函数我们只完成了返回一个页面的功能,现在不仅是返回页面,我们应该处理post提交的数据,怎么处理?每次请求都是经过此函数,所以我们要对这两次请求加以区分,怎么区分?我们要判断请求方式是get还是post,通过request.method判断即可,那么如何获取提交过来的数据呢?如果是get请求的数据通过request.GET.get获取,如果是post请求的数据通过request.POST.get获取。所以我们views函数这样完成。

def login(request):
    if request.method == 'POST':
        print(request.POST)  # <QueryDict: {'username': ['taibai '], 'password': ['123']}>
    
        username = request.POST.get('username').strip()
        password = request.POST.get('password').strip()
        print(username)
        if username == 'taibai' and password == '123':
            return HttpResponse('登录成功')
        else:
            return HttpResponse('登录失败')

    else:
        return render(request, 'login.html')
  

post提交数据时你们可能会遇到这种情况:    

 

  现在只需要做一步,在settings配置文件里面将这一行注释掉,这是django给你加的一个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',
]
复制代码

 还记得django写视图函数的时候,有一个参数是必须要给的吗,叫做request,如果你是post请求,那么就用request.POST,就能拿到post请求提交过来的所有数据(一个字典,然后再通过字典取值request.POST.get('username'),取出来的就是个字符串,你在那个字典里面看到的是{'username':['taibai']},虽然看着是列表,但是request.POST.get('username')取出来的就是个字符串),通过request.GET就能拿到提交过来的所有数据,而且记着,每一个视图函数都要给人家返回一些内容,用render或者HttpResponse等,其实render里面也是通过HttpResponse来返回内容,不然会报错,错误是告诉你没有返回任何内容:

    

 

  django认识了,以后我们就按照下面的步骤来学:

    1.django的url控制器

    2.django的视图

    3.django的模板(template)

    4.ORM(花的时间比较久)

做一个小总结

目前我们学过的一些参数:

render:返回给浏览器一个html页面,第一个参数一定是request。
HttpResponse:返回给浏览器一个字符串数据。
request  包含请求相应的服务器程序所有信息。
request.method:请求方法,返回大写的GET,POST。
request.POST:post请求的数据,返回一个querydict.
request.POST.get(''):返回对应的值
request.GET: post请求的数据,返回一个querydict.
request.GET.get(''):返回对应的值。

 

posted @ 2020-02-04 15:53  太白*金星  阅读(3569)  评论(0编辑  收藏  举报