说明:我是先上手做一些简单的例子,然后在尝试的过程中理解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. [css]我要用css画幅画(九) - Apple Logo

    接着之前的[css]我要用css画幅画(八) - Hello Kitty,这次画的是苹果公司的logo 这次打算将分析和实现步骤尽量详细的说一说. 其实之前的也打算详细讲分析和设计过程,不过之前的图比 ...

  2. out

    //练习1 class Program { static void Main(string[] args) { //写一个方法 求一个数组中的最大值.最小值.总和.平均值 int[] numbers ...

  3. native2ascii 使用说明

    native2ascii.exe 是Java的一个文件转码工具,是将特殊各异的内容转为用指定的编码标准文体形式统一的表现出来,它通常位于JDK_home\bin目录下,安装好Java SE后,可在命令 ...

  4. tomcat 设置jvm内存

    修改 tomcat安装目录\bin\catalina.bat在set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%这行下面加上 set JAVA_OPTS=%JAVA_ ...

  5. W3School-CSS 内边距 (padding) 实例

    CSS 内边距 (padding) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CS ...

  6. javax.el.PropertyNotFoundException 出错

    之所以是把他记下来,是因为这个低级错误 害的我找了老半天. 后台传了对象到页面,在页面中循环遍历获得对象某个属性值 如下: <c:forEach items="${resultMap. ...

  7. 如何穿越到android底层

    对于android开发,实际上大部分工作都是在应用层,但为了体现"技术含量",以及"知其所以然",以便在遇到问题是不至于束手无策.因此有必要了解底层的工作机制. ...

  8. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。问题

    JSP页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Ja ...

  9. mac版本navicat连接oracle报错ORA-21561

    最近电脑更换成mac,很多软件都和win不一样了,正在慢慢适应,连接oracle原来用的客户端是pl/sql develop,蛋疼的是没有了mac版本, 用了navicat,具体设置如下 1.新建连接 ...

  10. 开源一个windows下的定时任务框架,简单粗暴好用。

    这里是你想要的功能: 支持插件,将你要执行的任务编译成程序集放到框架的根目录下,再进行简单的配置就行了. 支持Corn表达式.想让任务在什么时候执行就在什么时候执行. 支持安装成windows ser ...