Django基础学习Ⅰ

一、Django简介

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

  • Django是一个处理网络请求的webweb应用框架
  • Django是开源的

Django有四个核心组件: - 1.数据模型和数据库之间的媒介ORM - 2.基于正则表达式的URL分发器 - 3.视图处理系统 - 4.模板系统

MVC:

m modules 模型, 和数据库字段对应

v views 视图 用来展示给用户的,就是我们所学到的前端

c controll url控制, 一个url,对应一个方法或者类

二、Django特点

  1. 强大的数据库功能:用python的类继承,几行代码就可以拥有一个动态的数据库操作API,如果需要也能执行SQL语句。
  2. 自带的强大的后台功能:几行代码就让网站拥有一个强大的后台,轻松管理内容。
  3. 优雅的网址:用正则匹配网址,传递到对应函数。
  4. 模板系统:强大,易扩展的模板系统,设计简易,代码和样式分开设计,更易管理。
  5. 缓存系统:与memcached或其它缓存系统联用,表现更出色,加载速度更快。
  6. 国际化:完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言

三、安装Django

使用pip工具来安装Django,直接通过下面命令来安装就可以。

# pip install Django

用一下测试django是否安装成功:

C:\Users\ZHDYA>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print (django.VERSION)
(2, 0, 6, 'final', 0)

四、创建项目

首先,我们先通过django来创建一个项目,命令如下:

# django-admin startproject firstproject

然后在当前目录下就自动生成了一个firstproject的项目 然后就可以启动这个项目了:

# python manage.py runserver 127.0.0.1:8080

默认不写ip绑定的是本机的所以ip地址,端口默认为8000

也可以通过在pycharm中直接创建一个Django项目,就自动创建好了文件,然后配置manage.py脚本的参数。

mark

直接再次运行manage.py文件就好。

然后访问url:

http://127.0.0.1:8080
有一个欢迎的首页

mark

4.1、项目目录结构

第一层:DjangoTest    项目名称

第二层: DjangoTest目录和__init__.py文件,声明是一个包,表示项目实际的python包,不要随意更改该目录,与配置有关联

settings.py    	项目的全局(所有项目)配置中心

urls.py      	项目的url配置中心

wsgi.py      	项目的wsgi配置中心

templates	模板目录

manage.py	django命令管理脚本
mark

setting.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))      ## 类似于环境变量

SECRET_KEY =        ##密钥

DEBUG = True        ##当报错时显示的错误信息

ALLOWED_HOSTS = []       ##允许哪些机器可以访问

五、创建app

打个比方,jd网站:http://www.jd.com/,上面有各种各样的不同模块,我们划分为不同的app,那我们就需要在django里面创建不通的app啦。接下来,我们就来看看如何创建app 如果是命令行模式:

#python manage.py startapp linux
#python manage.py startapp python

如果是pycharm,你就需要点击:

Tools->>Run manage.py Task

然后出现的交互命令行上输入:

startapp newapp
这样就创建了newapp的app。

mark

六、Django的解析顺序

既然我们知道Django是使用的MVC的架构,那我们先来聊聊MVC是什么样的原理,首先,通过MVC中的C就是control,用来接收url请求,对应我们django中的url.py模块,M就代表Model,调用数据库的Model层,就是Django的model.py模块,然后经过业务逻辑层的处理,最后渲染到前端界面。前端就是MVC中的view层,对应django的view模块。

其实所有的参数定义都是以setting.py为准,++首先django先去setting.py中找到ROOT_URLCONF = 'firstproject.urls'找到总url++。然后在firstproject下的urls.py文件中的urlpatterns列表变量,然后根据里面的URL的正则表达式进行解析,如果解析到,就调用第二个参数,第二个参数对应一个类或者一个函数,或者直接是一个前端页面,在经过类或者函数处理完以后,在展现在前端界面。而前端是单独的html文件,前端界面和后端处理分开,架构更加清晰。

在上面的目录结构中,每一个app都会有一个view.py, model.py,我们自己还要在创建一个url.py,通过include函数,在firstproject项目中的总url.py分出去,把属于各自的app的url分配到不通的APP的urls.py文件中,这样可以降低耦合度,增加代码的健壮性。 。

6.1、创建urls.py文件

urls作为程序的url入口,支持正则匹配,讲访问的url映射到view中的函数中。为了能调用每个app管理自己的url,我们首先需要在DjangoTest的urls.py文件中做如下修改:

from django.conf.urls import url, include
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^newapp/', include('newapp.urls')),
]

注意事项: 为了避免和别的app取同样的名字,一般我们会在名字前加一个app名称作为前缀 url匹配,主url不需要/反斜杠:==因为django已经给域名加了一个反斜杠,如:http://127.0.0.1/ 主url后面要加/, app的url前面就不需要加/了, 主url后面一般不要加\(符号, app的url后面要加\)符号==

然后在创建newapp/urls.py文件,编辑如下:

from django.conf.urls import url, include

from newapp import views

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

配置 view.py文件

而以上:http://127.0.0.1:8080/newapp的url对应的就是view模块中的index函数,在linux的view.py中定义index函数

from django.http import HttpResponse

def index(request):
    return HttpResponse("This is a test Django index!!!")

然后在浏览器上访问:http://127.0.0.1:8080/newapp/,如下图所示:

mark

6.2、如果再次增加内容:

urls.py
from django.conf.urls import url, include

from newapp import views

urlpatterns = [
    url(r"^$", views.index),
    url(r'newapp/', views.index),
    url(r'hello/', views.hello)
]
views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("This is a test Django index!!!")

def hello(request):
    return HttpResponse("<h1 style='text-align:center'> hheello world!!!</h1>")

当访问:http://127.0.0.1:8000/newapp/hello/

这会出现一个一级标题且居中的字体。

6.3、urls捕获参数(匹配正则表达式)

在urls.py中增加如下:

url(r'hello/p1(\w+)p2(.+)/$', views.hello, name=hello),

在views.py中增加如下:

def hello(request, p1, p2):
    return HttpResponse("hello {0}, hello {1}".format(p1, p2))
mark

url参数的捕获有两种方式:

b 捕获关键字参数:在url函数中,正则表达是用(?P)进行捕获,然后在views.py中定义即可

在urls.py中增加如下:

url(r'keyword/(?P<ip>\S+)/$', views.keyword, name=keyword),

在views.py中增加如下:

def keyword(request, ip):
	return HttpResponse("the ip is {0}".format(ip))

在浏览器上访问url:http://127.0.0.1:8080/newapp/keyword/1.1.1.1/

七、urls重定向

在学习url重定向之前,我们先来看看定义url的函数是怎样一个表达形式。

注意如下,有个参数 name= 这个是必须要写的,类似于起个别名。

def url(regex, view, kwargs=None, name=None):

regex:url匹配的正则字符串

view:一个可以调用的类型函数,或者使用include函数

kwargs:关键字参数,必须是一个字典,可以通过这个传递更多参数给views.py,views通过kwargs.get(“key”)得到对应的value

name:给URL取得名字,以后可以通过reverse函数进行重定向

对于kwargs如何传递参数,我们来看一个例子:

在urls.py中增加如下:

url(r'test/$', view=views.test, kwargs={"name": "zhdya"}, name="test"),

在views.py中增加如下:

def test(request, **kwargs):
    return HttpResponse("the name is : {0}".format(kwargs.get("name")))

在浏览器上访问url:http://127.0.0.1:8080/newapp/test/

mark

既然已经知道name属性的用法,现在我们就来说重定向,重定向常用name属性来进行重定向

修改urls.py
url(r"^$", views.index, name="index"),
url(r"redirect/$", view=views.redirect,  name="redirect"),
修改views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
def redirect(request):
    return HttpResponseRedirect(reverse("index"))

在浏览器上访问url:http://127.0.0.1:8080/newapp/redirect,直接跳转到http://127.0.0.1:8080/newapp/,

mark

当然也可以指定返回数据的具体类型,例如:Json格式返回

urls.py

from django.conf.urls import url, include

from newapp import views

urlpatterns = [
    url(r"^$", views.index, name="index"),
    # url(r'hello/', views.hello)
    url(r'hello/p1(\w+)p2(.+)/$', views.hello, name="hello"),
    url(r'test/$', view=views.test, kwargs={"name": "zhdya"}, name="test"),
    url(r"redirect/$", view=views.redirect, name="redirect")
]

在views.py中修改主页为:

def index(request):
    test = dict()
    test['name'] = "zhdya"
    test['sex'] = "man"
    test['age'] = 28
    # return HttpResponse("This is a test Django index!!!")
    return HttpResponse(json.dumps(test))

mark

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!