说明:我是先上手做一些简单的例子,然后在尝试的过程中理解Django的原理,笔记也是按这个思路来的。

一、Django结构与基本文件介绍

1. django-admin.py

工程管理工具,主要用于创建项目和app等。

例:django-admin.py startproject project_example

会在当前目录下创建一个名为project_example的工程,目录结构如下:

|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|    |-- manage.py

2. manage.py

命令行工具,用于和Django项目进行交互。

比如:
python manage.py startapp app_example  //创建名为app_example的app
python manage.py runserver    0.0.0.0:8000    //启动app服务,0.0.0.0是让其他电脑可以连接到服务器,8000是端口,默认就是8000
python manage.py syncdb            //连接数据库创建表,较早版本,较新的版本已经移除,变成了下面的命令

python manage.py makemigrations   
python manage.py migrate

3. settings.py

Django工程的配置文件,主要有以下几个:

(1)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_example',
]

在这里添加我们自己创建的app的目录名,不添加在这里就无法调用app中的内容。

(2)

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test123',
'HOST':'localhost',
'PORT':'',
}

设置连接数据库的信息

(3)

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

模板信息,'DIRS'是模板所在路径,比如在最外层的project_example目录下建一个模板文件夹templates。则应这样写: 'DIRS': [BASE_DIR+"/templates",],

目录结构如下:
|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|    |-- manage.py
|    |-- templates
|        |-- user_info.html

(4)

LANGUAGE_CODE = 'en-us'        //语言
TIME_ZONE = 'UTC' //时间

4. urls.py

该Django项目的URL声明,一份由Django驱动的网站"目录"。

一般格式:

from project_example.view import hello
urlpatterns = patterns("",
('^hello/$', hello),
)

(1) 先导入view对象或者相应的视图函数。
(2) 然后指定URL与相应函数的对应关系
(3) 当客户端访问某个URL时就会调用相应函数

例如:

from project_example import view
urlpatterns = patterns("",
('^test1/$', view.test1),
('^test2/$', view.test2),
)

当访问 localhost:8000/test1 时就会调用view.test1()函数,访问 localhost:8000/test2 时就会调用view.test2()函数.

5. 用不到的文件

__init__.py:空文件,告诉Python该目录是一个Python包。
wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目

二、一个简单Django例子的运行流程

1. 创建模板文件,也就是上述的templates/user_info.html

例:

<html>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>用户信息</title>
<head></head>
<body>
<h3>用户信息:</h3>
<p>姓名:{{name}}</p>
<p>年龄:{{age}}</p>
</body>
</html>

在模板里,我们只填共用组件,至于那些因‘人’而异的组件就用Django的特殊标签来代替。
比如这里name和age是因‘人’而异的,所以我们用{{name}}{{age}}这两个变量表示,具体的值由view.py中的视图函数去填充。

2. 创建视图函数

首先在内存的project_example中创建view.py文件,然后在其中添加对象,用于向模板提交数据。

目录结构如下:
|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|        |-- view.py
|    |-- manage.py
|    |-- templates
|        |-- user_info.html

view.py内容:

这里我试了这两种写法都可以

from django.shortcuts import render
from django.shortcuts import render_to_response
def user1(request):
name = 'aaa'
age = 24
return render_to_response('user_info.html',locals()) def user2(request):
name = 'bbb'
age = 18
context = {}
context['name'] = 'bbb'
context['age'] = ''
return render(request, 'user_info.html', context)

3. 修改urls.py

from django.conf.urls import url
from project_example import view urlpatterns = [
url(r'user1/$', view.user1),
url(r'user2/$', view.user2),
]

4. 发布服务

python manage.py runserver 0.0.0.0:8000

5.登录网址

http://localhost:8000/user1/

显示如下:
用户信息:
姓名:aaa
年龄:24

http://localhost:8000/user2/

显示如下:
用户信息:
姓名:bbb
年龄:18

三、 view.py文件中的视图函数语法解析(待填充)

1. request 对象

通过例子可以看到,所有的视图函数都有这个参数 request,那他到底是干嘛的呢?

简单的来讲,request是一个HttpRequest对象,他保存着Django接收到请求的所有信息。

比如请求URL的一些信息:

request.path    除域名以外的请求路径

request.get_host()    主机名/域名

request.get_full_path()    请求路径

。。。

其他信息:

request.method    传输数据的方式,'GET'或'POST'

request.GET/request.POST    一个字典对象,保存着传来的数据

更多的信息可以百度一下。

2.reander 和 reander_to_response

reander 和 reander_to_response都是Django提供的返回数据的快捷方式,在视图函数结束之后,直接调用这两个方法就可以将数据返回给客户端,不需要我们自己再调用一堆传输函数了。

格式:

from django.shortcuts import render

reander(request,data,...)  //request就是我们上面讲的那个HttpRequest对象,data就是我们想要传回去的数据,可以是html文件,也可以是字符串等。

from django.shortcuts import render_to_response

reander_to_response(data,...)  //直接写传回的数据就行

四、Http通信

这里先只讲一下POST通信

1. 创建html模板进行通信

代码:

<html>
<head>
<meta charset="utf-8" />
<title>Search - w3cschool.cc</title>
</head>
<body>
<form action="/search-post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Submit">
</form> <p>{{ rlt }}</p>
</body>
</html>

2. 内层 project_example 目录下创建search.py

目录结构如下:
|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|        |-- view.py
|        |-- search.py
|    |-- manage.py
|    |-- templates
|        |-- user_info.html

search.py代码:

from django.shortcuts import render
#from django.core.context_processors import csrf 1.2版本之前
#from django.contrib.auth.context_processors import csrf 1.2~1.4版本
from django.template.context_processors import csrf #1.10版本 # 接收POST请求数据
def search_post(request):
ctx ={}
ctx.update(csrf(request))
if request.POST:
ctx['rlt'] = request.POST['q']
else:
ctx['rlt'] = 'here'
return render(request, "post.html", ctx)

3.添加urls.py

from django.conf.urls import url
from project_example import view
from project_example import search urlpatterns = [
url(r'user1/$', view.user1),
url(r'user2/$', view.user2),
url(r'search-post/$', search.search_post),
]

4.发布+访问

python manage.py runserver 0.0.0.0:8000

http://localhost:8000/search-post/

5.请求流程

用户发送请求 -> 服务端执行search_post(),if不成立 -> 显示post.html页面 -> 在该页面点击提交按钮之后数据再次传递给localhost:8000/search-post/ -> 服务端再次执行search_post(),这次if成立

2.关于APP或JS客户端POST通信失败的原因

我在用POST通信时,如果不是通过浏览器访问服务端,就会一直报403的错误。

原因是Django的CSRF保护协议,浏览器可以自己在头文件中修改使其符合Django的要求,但JS和APP客户端修改头文件是不行的。

具体原因见:

http://blog.csdn.net/ybdesire/article/details/48196843

解决方法见:

http://www.wengweitao.com/corskua-yu-zi-yuan-gong-xiang-cross-origin-resource-sharing.html

首先修改配置,然后在view.py里这样写

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt

def search_post(request):

  。。。

五、JSON解析

Python中有专门编码和解码JSON的模块Demjson,他提供了两个方法

demjson.encode():将 Python 对象编码成 JSON 字符串
demjson.decode():将已编码的 JSON 字符串解码为 Python 对象

例:

import demjson

data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
json = demjson.encode(data)
print json

结果:[{"a":1,"b":2,"c":3,"d":4,"e":5}]  //json字符串

json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = demjson.decode(json)
print text

结果:{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}  //字典对象

六、数据库操作

1. 设置setting.py文件中的数据库配置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test123',
'HOST':'localhost',
'PORT':'',
}

这里面的用户信息要和电脑上MySQL中的用户信息相同。

2. Django规定使用模板必须创建APP对象

命令: python manage.py startapp TestModel

目录结构如下:
|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|        |-- view.py
|        |-- search.py
|    |-- manage.py
|    |-- templates
|        |-- user_info.html
|    |-- TestModel
|        |-- __init__.py
|        |-- admin.py
|        |-- models.py
|        |-- tests.py

3. 修改TestModel/models.py文件,Django会根据这个文件创建表

代码:

from django.db import models

class Test(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(max_length=3)

这里指定了一个名为 TestModel_Test 的表。(表名:目录名_类名)
表中有3个字段:id(默认),name,age

4. 在内层的project_example目录下创建testdb.py保存执行数据库操作函数

目录结构如下:
|-- project_example
|    |--project_example
|        |-- __init__.py
|        |-- settings.py
|        |-- urls.py
|        |-- wsgi.py
|        |-- view.py
|        |-- testdb.py
|    |-- manage.py
|    |-- templates
|        |-- user_info.html
|    |-- TestModel
|        |-- __init__.py
|        |-- admin.py
|        |-- models.py
|        |-- tests.py

testdb.py代码:

from django.http import HttpResponse
from TestModel.models import Test # 数据库操作
def testdb(request):
#添加数据
test1 = Test(name='w3cschool.cc')
test1.save() # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果
response0 = Test.objects.filter(id=1) # 获取单个对象
response1 = Test.objects.get(id=1) return HttpResponse("<p>数据库操作成功!</p>")

5.修改urls.py文件并发布

from django.conf.urls import url
from project_example import view
from project_example import search
from project_example import testdb urlpatterns = [
url(r'user1/$', view.user1),
url(r'user2/$', view.user2),
url(r'search-post/$', search.search_post),
url(r'testdb/$', testdb.testdb),
]

发布:python manage.py runserver 0.0.0.0:8000

七、尝试了一些简单例子之后,回顾理解Django结构

Django主要分为三部分:模板模型表单

模板:表现逻辑部分,就是上述的view.py文件,主要负责Web开发中展现的页面内容。在App开发中应该就是逻辑运算部分,名字就不用view了。

模型:数据存取逻辑,也就是数据库操作那部分。

表单:业务逻辑,对应着urls.py文件,根据用户传来的数据决定调用模板中的哪些函数来处理。

Django学习笔记(现学现写,实时更新)的更多相关文章

  1. python Django 学习笔记(六)—— 写一个简单blog做增删改练手

    简单效果图 1,创建一个项目myblog 可参考这里 myblog/ manage.py myblog/ __init__.py settings.py urls.py wsgi.py 2,创建blo ...

  2. flex学习笔记 使用函数,显示实时更新的标签

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  3. Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录

    一,项目题目:扩展Django自带User模型,实现用户注册与登录 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册,登录,用户认证,注销,修改密码等功能. ...

  4. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  5. TCP/IP详解学习笔记 这位仁兄写得太好了.(转载)

    TCP/IP详解学习笔记   这位仁兄写得太好了   TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/20444 ...

  6. Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程

    这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...

  7. Django 学习笔记1-- URLconf

    今天好像巴黎有点乱,希望明天太阳还会照常升起. 简介 Django 是一个由 Python 编写.开源并采用经典的 MVC 设计模式的 Web Full Stack 应用框架. 在 Django 中, ...

  8. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  9. Django 学习笔记(七)数据库基本操作(增查改删)

    一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...

  10. Django学习笔记(9)—— 开发用户注册与登录系统

    一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...

随机推荐

  1. Oracle监听服务启动失败案例

    在ORACLE测试服务器上还原恢复了一个数据库后,启动监听服务时出现了TNS-12541, TNS-12560,TNS-00511之类的错误,具体情况如下所示: [oracle@getlnx01 ad ...

  2. CentOS7 虚拟机搭建、初始设置、简单使用

    注:虚拟机安装的系统是CentOS7 1.网络设置 网络的设置主要是为了让虚拟机和物理机能够相互ping通,这样就可以用XShell之类的工具操控,也可以上网 见另一篇 CentOS7网络配置 2.物 ...

  3. MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

    回到目录 上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是 ...

  4. “未来人类”的笔记本,谁买过哦

    在jd上看到这款笔记本http://item.jd.com/1166095693.html.拽的很!看看哦,我等IT屌丝别吓着了,看图片欣赏下.

  5. 【转载】Linux 文件系统的目录结构

    /bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令:比如 ls.cp.mkdir等命令:功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令.做为基础 ...

  6. [WPF系列]-使用Binding来同步不同控件的Dependency property

    简介 项目中经常会用到,同步两个控件的值,本文就简单列举两种方式来同步不同控件的两个Dependency Property. 示例 效果图: 只使用C#代码: //获取slider1的ValueDep ...

  7. [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板

      引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate)   切换模板的两种方式:   使用DataTemplateSelecto ...

  8. 工欲善其事必先利其器——web调试工具firebug

    一.Firebug工具简介 firebug是firefox下的一款开发类插件.firebug集html查看和编辑,JavaScript控制台,网络状况监视器于一体,是开发JavaScript,css, ...

  9. 一个页面从输入URL到页面加载显示完成,这个过程都发生了什么?

    对于网址栏的URL不同的操作方式有不同的加载资源.获取数据的方式,下面的详细过程针对"在地址栏输入URL,按enter(回车)键加载资源"此种操作方式做解析,其它的方式的过程大同小 ...

  10. 第7章 权限管理(2)_文件特殊权限(SUID、SGID、SBIT)

    2. 文件特殊权限(主要用来临时提升命令执行者或其组身份) 2.1 SetUID (1)SetUID的功能 ①只有可以执行的二进制程序才能设定SUID权限.用来临时提升执行程序(或某条命令)的用户身份 ...