码迷,mamicode.com
首页 > 其他好文 > 详细

Django基础之MTV模型

时间:2018-01-10 01:11:25      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:不同   __init__   pass   ons   访问   key   generic   业务逻辑层   定义   

一、Django基础

  一、Django简介

  Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型(Model)、视图(View)和控制器(Controller)。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

  1、mvc简介

  http://blog.csdn.net/pi9nc/article/details/18822325

  • Model:封装领域数据及逻辑。用于管理应用程序域的行为和数据,并响应为获取其状态信息(通常来自视图)而发出的请求,还会响应更改状态的指令(通常来自控制器)。

  • View:查询领域数据并展现给用户。用于管理信息的显示。

  • Conctroller:截获用户请求并改变领域数据。用于解释用户的鼠标和键盘输入,以通知模型和/或视图进行相应的更改。

  技术分享图片

  2、MTV模式简介

  Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:

  模型(Model),即数据存取层

  处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

  模板(Template),即表现层

  处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

  视图(View),即业务逻辑层

  存取模型及调取恰当模板的相关逻辑。模型与模板之间的桥梁。

       此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

技术分享图片

  3、MTV模型的基本结构

│  db.sqlite3 ----------sqlie3数据库
│  manage.py        
│      
├─logres
│  │  admin.py          后台,可以用很少量的代码就拥有一个强大的后台。
│  │  apps.py
│  │  models.py         与数据库操作相关,存入或读取数据时用到这个
│  │  tests.py
│  │  urls.py
│  │  views.py  
│  │  处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示
│  │      内容比如登陆后的用户名,用户请求的数据,输出到网页。
│  │  __init__.py
│  │  
│  ├─migrations
│     │  0001_initial.py
│     │  __init__.py
│    
│  
│  
│  
├─Mushishi
│  │  settings.py  Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等
│  │  urls.py    urls.py
│  │             网址入口,关联到对应的views.py中的一个函数(或者generic类),
│  │             访问网址就对应一个函数。
│  │  wsgi.py    wsgi有多重一种uwsgi和wsgi,你用那种wsgi来运行Django,
                 一般不用改只有你用到的时候在改
│  │  __init__.py
│   
│          
├─static
└─templates         templates中的Html模板,
        index.html
        login.html
        regist.html

   二、安装Django

1.window 使用pycharm安装
    过程略
2.window上使用pip安装 
    pip install django               ##安装最新版本
    pip install django==1.11         ##安装指定的版本
3.linux下使用pip安装
    yum install python-pip
    pip install django               ##安装最新版本
    pip install django==1.11         ##安装指定的版本
4.检查是否安装成功
>>> import django
>>> django.VERSION

  三、Django基本命令

  1、创建django命令

django-admin.py startproject project-name(你工程的名字)

   当前目录下会生成mysite的工程,目录结构如下

  技术分享图片 

  1. manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
  2. settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  3. urls.py ----- 负责把URL模式映射到应用程序。

  2、创建django的app

python manage.py startapp app-name(你app的名字)
或 django-admin.py startapp app-name(你app的名字)

  技术分享图片

  3、调试模式,启动项目

python manage.py runserver 8080
#监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
python manage.py runserver 0.0.0.0:8000

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

技术分享图片

  4、同步数据库

python manage.py syncdb
注意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

  这种方法可以创建表,当你在models.py中新增了类时,运行它就可以自动在数据库中创建表了,不用手动创建。

  5、清除数据库

python manage.py flush

  此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。

  6、创建超级管理员

python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
按照提示就ok

修改管理员密码
python manage.py changepassword username(你当时设定的用户名)

  7、导入和导出数据

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

  8、Django项目终端

python manage.py shell

  这个命令和 直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据的测试非常方便。

  9、Django项目环境终端

python manage.py dbshell

  Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。

在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。

  10、查看帮助信息

python manage.py

   查看所有的命令,忘记子名称的时候特别有用。

  11、静态文件配置

概述:
     静态文件交由Web服务器处理,Django本身不处理静态文件。简单的处理逻辑如下(以nginx为例):

              URI请求-----> 按照Web服务器里面的配置规则先处理,以nginx为例,主要求配置在nginx.
                             conf里的location

                         |---------->如果是静态文件,则由nginx直接处理

                         |---------->如果不是则交由Django处理,Django根据urls.py里面的规则进行匹配

    以上是部署到Web服务器后的处理方式,为了便于开发,Django提供了在开发环境的对静态文件的处理机制,方法是这样:

  static配置:

STATIC主要指的是如css,js,images这样文件:

STATIC_URL = /static/      # 别名
STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"static"),  #实际名 ,即实际文件夹的名字
        )

注意点1:
 django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
        <script src="/statics/jquery-3.1.1.js"></script>
        ------error-----不能直接用,必须用STATIC_URL = /static/:
        <script src="/static/jquery-3.1.1.js"></script>

注意点2:
 STATICFILES_DIRS = (
    ("app01",os.path.join(BASE_DIR, "app01/statics")),
        )

 <script src="/static/app01/jquery.js"></script>

  media配置:

# in settings:

MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

# in urls:
from django.views.static import serve
url(r^media/(?P<path>.*)$, serve, {document_root: settings.MEDIA_ROOT}),

   访问测试:http://127.0.0.1:8080/media/1.png

技术分享图片
‘‘‘
        静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的:
        
        MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义
        
        MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:\temp\media\abc

        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上传的图片就上传到c:\temp\media\photo,而在模板中要显示该文件,则在这样写
          在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,‘media/‘).replace(‘\\‘,‘/‘)

        MEDIA_URL是指从浏览器访问时的地址前缀,举个例子:
            MEDIA_ROOT=c:\temp\media\photo
            MEDIA_URL="/data/"
        在开发阶段,media的处理由django处理:

           访问http://localhost/data/abc/a.png就是访问c:\temp\media\photo\abc\a.png

           在模板里面这样写<img src="/media/abc/a.png">

           在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置,
           以便能让web服务器能访问media文件
           以nginx为例,可以在nginx.conf里面这样:

                 location ~/media/{
                       root/temp/
                       break;
                    }

           具体可以参考如何在nginx部署django的资料。
           
           
           ‘‘‘
View Code

二、Django项目实战

  注:此环境在window环境下使用pycharm进行的

  一、创建一个project工程和app

  1、pycharm创建项目

  技术分享图片

  2、project和APP概念

  Project是一个大的工程,

  下面有很多功能:(一个Project有多个App,其实他就是对你大的工程的一个分类)

  例如一个运维平台是一个工程,那么他的app就是CMDB,监控系统,OA系统,

  3、生成数据库 创建超级管理员用户

  注:此步骤是在pycharm的终端里使用命令实现的

1.同步数据库
python manage.py makemigrations
python manage.py migrate
本人使用的是django1.9.5版本
2.创建超级管理员
python manage.py createsuperuser
3.运行django
python manage.py runserver 8000

  浏览器访问: http://127.0.0.1:8000/admin/

  3、路由

  首先在helloword文件夹下(不是app目录,千万别写错)的urls.py填写路由规则

from django.conf.urls import url
from django.contrib import admin
#导入app下的view函数
from helloapp import  views
urlpatterns = [
url(r^admin/, admin.site.urls),
#当用户访问http://127.0.0.1:端口号的时候之间交给helloapp下面的views里的index函数来处理
url(r^$, views.index),
]

  4、views函数

   在helloapp(app)下面的views里写一个index函数

#Django 在返回的时候需要一层封装,需要导入HttpResponse
from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
     #使用HttpRespons 封装返回信息
    return HttpResponse(<h1>hello world!!!</h1>)

  django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

   如果要返回html页面

在templates里创建index.html页面
内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello world!!</h1>
</body>
</html>
2.修改helloapp里的views.py的index函数

from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# return HttpResponse(‘<h1>hello world!!!</h1>‘)
return  render(request,index.html)
#找到index.html
#读取index.html返回给用户

  python manage.py runserver 8000

  使用浏览器访问:http://127.0.0.1:8000

  二、Django路由系统

  在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下:

  每一个urls对应一个views里的函数

  1、基本的urls对应

urlpatterns = [
url(r^login/$, views.login),
url(r^index/$, views.index),
url(r^$, views.login),
]

  2、基于app的路由

  根据app对路由规则进行一次分类

  当app的urls很多的时候,那么就不能再工程的urls下面去设置,应该这样设置:

    1、首先在helloword下面的urls这样设置
#导入include
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from helloapp import  views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    #使用helloapp的urls规则
    url(r^helloapp/,include(helloapp/urls))

]
    2、在helloapp下面创建一个urls.py
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^login/,views.login),
    url(r^index/,views.index),
    url(r^reg/,views.reg),
    url(r^layout/,views.layout),
]
    3、在helloapp下面的views里创建上面urls对应的函数
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
    # return HttpResponse(‘<h1>hello world!!!</h1 >‘)
    return  render(request,index.html)
def login(request):
    return HttpResponse(login)
def reg(request):
    return HttpResponse(reg)
def layout(request):
    return HttpResponse(layout)
    4、访问测试
http://127.0.0.1:8000/helloapp/admin/ admin后台管理
http://127.0.0.1:8000/helloapp/layout/
http://127.0.0.1:8000/helloapp/login/
http://127.0.0.1:8000/helloapp/reg/
http://127.0.0.1:8000/helloapp/index/

  3、动态路由(传一个参数)

  比如分页:当urls大量过多的时候比如几百个的时候,那么肯定不会去写几百个路由规则
  所有这个时候就需要动态urls,使用正则表达式来完成

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(\d+)$, views.book), //正则匹配
]
    2、在helloapp下面的views写入以下内容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,num):
    print(num)
    return HttpResponse(num)
当用户访问http://127.0.0.1:8000/helloapp/book/数字的时候
django会在自动把参数传给views里的book函数
    3、测试访问:
http://127.0.0.1:8000/helloapp/book/2

显示2

http://127.0.0.1:8000/helloapp/book/1

显示1

  4、动态路由(传多个参数)

  多个参数它是已/来分割的

  来一个url的加法

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(\d+)/(\d+)$, views.book),
]
    2、在helloapp下面的views写入以下内容:
def book(request,num1,num2):
    print(num1,num2)
    num = int(num1) + int(num2)
    return HttpResponse(num)
    3、测试访问:
http://127.0.0.1:8000/helloapp/book/2/1
显示3
http://127.0.0.1:8000/helloapp/book/2/10
显示12

  他的顺序是:正序的,你先给他传那个值,第一个参数就是那个

  5、动态的路由(Key:value的形式)

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(?P<k1>\d+)/(?P<k2>\d+)$, views.book),
    这里?p<v1>这里的v1就是key,vlaue就是传进去的值,
]
    2、在helloapp下面的views写入以下内容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,k1,k2):
    print(k1,k2)
    return HttpResponse(k1+k2)

  这样我们就不必按照顺序去取了,可以通过key,value的方式来取传进来的值

  注:可以根据传来的值来进行判断返回给用户指定的url,过程略。

  6、基于反射的动态路由

仅仅是通过反射来实现的,通过文件找到里面的函数然后执行!
但是在Django中不建议使用此方法。因为不同的WEB框架建议你使用不同的方式,
Django就不建议使用反射

 

Django基础之MTV模型

标签:不同   __init__   pass   ons   访问   key   generic   业务逻辑层   定义   

原文地址:https://www.cnblogs.com/happy-king/p/8254530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!