【Django开发经由】

  本来以为看完网上的入门教程之后就可以看书详细学习一下,没想到手头上的这本书也讲得不是太详细。。无奈,不过好在这本书从无到有建立一个网站的流程还算可以,就以这个角度简单记录一下,顺便也对之前发现但是还没来得及记录的一些东西进行一些总结。

■  建立项目

  首先是建立项目,我没用django-admin的命令行,而是直接用了Pycharm的建立新项目。建立完成之后就有了项目结构,关于自动创建的几个文件分别是哪些作用。可以特别提一下的是urls.py文件在理想情况下应该是到各个模块的路由(也就是说除了默认的^admin/之外尽量不直接路由到一个界面而是一个Django下的App,让App进一步规定url到响应函数的映射)。另外wsgi.py这个文件一般不用动。

  因为djangosite/urls.py中的路由只是路由到模块这一层,所以我们肯定要startapp几个App来充实内容。比如我们创建一个test。此时会提示创建失败,因为在创建App目录的时候里面有一个test.py的文件,如果App也叫test的话就会引起模块名的混乱了。所有App名字就改成mytest吧。

■  基础路由与视图设置

  基础的路由设置就不多说了,这里讲一下之前没有提到过的几个路由设置的技巧:

  ●  多层URI的路由

  之前说到过的所有路由设置全部都是基于一个不变的如url(r'^test/'),但是作为一个正则表达式很明显有更加灵活的用法。比如下面这样的用法:

###djangosite/urls.py###
urlpatterns = [
url(r'^test/', include('mytest.urls')), #新增这行
] ###mytest/urls.py###
from django.conf.urls import url
import views urlpatterns = [
url(r'^add/(\d+)/(\d+)/', views.add)
] ###mytest/views.py###
from django.http import HttpResponse
def add(request,a,b):
a = int(a)
b = int(b)
return HttpResponse('<p>%s</p>' % (a + b) )

  如此,在访问如test/add/3/4的时候就可以看到返回的是7了。其要点在于,把路由表示的正则表达式中的子模式自动提取出来并作为参数传递给响应函数。需要注意参数个数应该和子模式个数一致。

  ●  静态文件

  一个网站的javascript,css,图片等这些内容一般都作为静态文件放在服务器上。

  相比于flask默认把项目根目录的一个static子目录作为静态文件的存放位置,并且把URI/static/直接和其相关起来相比,Django在默认情况下是没有配置静态文件的目录的。如果需要在项目根目录中像flask一样有个静态文件存放的地方的话那么可以这么干:

  首先当然是在根目录下面创建static文件夹,里面可以放上一些文件。

###djangosite/settings.py###
STATIC_URL = '/static/' #这条是默认有的,但是光有这条是不行的
STATICFILES_DIRS = (BASE_DIR,'static') #新加,注意没有os.path.join

  设置完静态文件的存放之后还可以通过如下的方式进行和前端的互动,也就是说前端可以直接引用一些静态文件,这正是我们的目的:

{% load staticfiles %}
<script type="text/javascript" src="{% static 'path/to/file' %}">

■  关联数据库

  之前的文章中提到过关联数据库的几个步骤。首先是修改settings.py中的DATABASES配置项,然后在相关的App下的models.py文件,修改之创建模型。看到书上之后知道了,python manage.py makemigrations的时候可以在后面加上一个App名,表示只固化这个App相关的模型的变动。

  但是直接python manage.py mytest的话会报错说没有安装APP,确实我们还需要到settings.py里面去设置一下INSTALLED_APPS这个配置。之前在文章中说的是直接以App的名字去INSTALL,不过这里介绍一种看起来更加时髦的办法,在每个新建的APP下面会自动有一个apps.py的文件,里面默认生成了一个XxxxConfig的类,继承自django.apps.AppConfig类。可以把这个类给写到INSTALLED_APPS里面去,目前来看效果是一样的。这是因为这个AppConfig类中有类似name,module,path,label等和一个App(老打App好麻烦,之后我们都称App为模块好了)相关的信息。所以直接在INSTALLED_APPS里面写模块名和写这个类效果一样,我怀疑即使是写模块名可能也是根据这个模块名来找这个类然后加载。

  然后就是熟悉的python manage.py makemigrations mytest,然后再python manage.py migrate。这里还注意到了一点,在第一次初始化数据库时,进行makemigrations之后,数据库中首先生成了一张django_migrations的表,然后migrate之后才有了其他乱七八糟的那些表的。

■  表单视图

  下面明确一下如何方便地把一个数据库模型类变成一个表单类:

###mytest/models.py###
from django.db import models class Moment(models.Model):
content = models.Charfield(max_length=200)
user_name = models.Charfield(max_length=20)
kind = models.Charfield(max_length=20)
def __unicode__(self):
return self.user_name,self.content ###mytest/views.py###
from django.forms import ModelForm
from mytest.models import Moment class MomentForm(Form):
class Meta: #采用了子类的方式进行类的转换
model = Moment
fields = '__all__' #__all__是指把模型类中的所有字段都导入表单类中

  fields也可以写类似('content','user_name','kind')这样的。

  ●  更高级一点的模型类

  插入在这里有些唐突,不过我们可以这样改造一下models.py中的类以使表结构(不涉及表之间的结构)更加复杂。

KIND_CHOICES = (
('Python技术','Python技术'),
('数据库技术','数据库技术'),
('经济学','经济学'),
('文体咨询','文体咨询'),
('个人心情','个人心情'),
('其他','其他')
) class Moment(models.Model):
content = models.Charfield(max_length=200)
user_name = models.Charfield(max_length=20,default='无名氏')
kind = models.Charfield(max_length=20,choices=KIND_CHOICES,default=KIND_CHOICES[0])

  这个类的kind字段已经有了一些合法的值的选项,实际上这个kind字段在表单中就会成为一个SelectField了,虽然在数据库中还是varchar类型的。

  然后就是编写模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>消息录入页面</title>
</head>
<body>
<form action="?" method="post">
<fieldset>
<legend>请输入并提交</legend>
{{ form.as_p }}
<input type="submit" value="submit" />
</fieldset>
</form>
</body>
</html>

  再编写views中的响应函数:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render
from mytest.forms import MomentForm def moments_input(request):
if request.method == 'POST':
form = MomentForm(request.POST)
if form.is_valid():
moment = form.save()
moment.save()
return HttpResponseRedirect(reverse('static_test_name'))
else:
form = MomentForm() return render(request,'moments_input.html',{'form':form})

  这段代码又有点新鲜的东西,HttpResponseRedirect顾名思义和django.shortcuts.redirect是差不多的,起到一个重定向的作用。reverse函数就像flask里的url_for,可以把一个endpoint形式的响应函数转化成相应的url,和url_for一样reverse也有一个args参数(或kwargs参数),可以给生成出来的GET请求的url自动加上参数。

  嗯。。书上的是endpoint形式的,可是我自己试了下发现并不行只有像上面代码写得那样才能成功得到url并进行重定向。那么static_test_name是什么?其实是在mytest/urls.py中设置url路由的时候,原先是url(r'^statictest',views.static_test)改成了url(r'^statictest',views.static_test,name='static_test_name')。只有设置了name参数,然后在reverse中参数写成这个name才可以顺利得到url。

  save什么的就是存进数据库,其实据我估计这边两个save是多余的,只要form.save()即可。我把下面的注释掉也能把数据顺利存进数据库。

  嗯。。管理界面上篇文章讲的挺详细了,就不多说了。

【Django】Web应用开发经由的更多相关文章

  1. Django Web接口开发

    什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...

  2. Django web框架开发基础-django实现留言板功能

    1.创建项目 cmd  django-admin startpoject cloudms 2.创建APP cmd django-admin startapp msgapp 3.修改settings,T ...

  3. 03 Django web服务开发 - URL路由

    Django中的APP -Django中的一个APP就是一个应用的意思 -项目可以包含多个APP(多个应用) -一个项目对应一个网站(生活服务网站) 一个APP队形网站的一个应用(二手交易,家政服务) ...

  4. 关于《Web接口开发与自动化测试--基于Python语言》

    关于封面logo 首先,你会被书封上面logo吸引,这么炫酷?双蛇杖?嗯,这是Requests的新logo. 旧的logo是一只乌龟. 新logo是双蛇杖: 看到新logo我首先想到的是 火爆全网页游 ...

  5. Django web 开发指南 no such table:

    在学习django web开发指南时,发布新博客点击save后会有error提示:no such table balabalabala... 百度了一下说重新运行manage.py syncdb 就可 ...

  6. web框架开发-Django简介

    MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  7. Django Web开发学习笔记(1)

    一.Python的标准类型 (1)bool型 >>> bool("") False >>> bool(None) False >>& ...

  8. 第六模块:WEB框架开发 第1章·Django框架开发1~50

    01-Django基础介绍 02-Web应用程序1 03-Web应用程序2 04-http请求协议1 05-http请求协议2 06-http协议之响应协议 07-wsgire模块1 08-wsgir ...

  9. Django Web开发指南笔记

    Django Web开发指南笔记 语句VS表达式 python代码由表达式和语句组成,由解释器负责执行. 主要区别:表达式是一个值,它的结果一定是一个python对象:如:12,1+2,int('12 ...

随机推荐

  1. 编译、裁剪、安装、删除 Ubuntu内核和模块管理

    一.下载最新内核文件 地址:http://www.kernel.org,一般下载Full Source版本. 下载完毕后,放到任意文件夹中,使用命令: tar jxvf linux-x.x.x.tar ...

  2. 阿里开源的热补丁框架AndFix使用教程

    阿里巴巴推出的AndFix框架 首次给出大家这个框架的地址:https://github.com/alibaba/AndFix 对源码比较感兴趣的同学们可以自行研究代码 AndFix原理介绍 AndF ...

  3. 【mysql】mysql内置函数

    mysql常用内置函数 1.mysql字符串函数 contact 字符串连接函数 mysql>select contact("he",'llo');# hello lcase ...

  4. RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像

    用光盘安装Linux,很容易,按照提示一步一步就好.如果没有光驱,只好想办法用硬盘或者U盘安装了. 首先说说怎样用U盘启动Linux的安装程序:1.将ISO镜像文件拷贝到U盘中,并解压到U盘根目录.将 ...

  5. Java并发 线程池

    线程池技术就是事先创建一批线程,这批线程被放入到一个池子里,在没有请求到达服务端时候,这些线程都是处于待命状态,当请求到达时候,程序会从线程池里取出一个线程,这个线程处理到达的请求,请求处理完毕,该线 ...

  6. 【Luogu1919】 A*B Problem升级版(FFT)

    题面戳我 题解 把每个数都直接看做一个多项式,每一位就是一项 现在求用FFT求出卷积 然后考虑一下进位就可以啦 #include<iostream> #include<cstdio& ...

  7. [BZOJ4517] [Sdoi2016] 排列计数 (数学)

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  8. C#利用substring按指定长度分割字符串

    这几天学习分析声音的波形数据,接收到的是十六进制的数据,需要将数据转换成十进制再绘图,这个过程涉及到字符串的分割,正好可以促进自己对C#相关知识的学习.说到分割字符串,我首先想到的是Split,但根据 ...

  9. telnet命令使用详解

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  10. golang []byte转string

    golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ "unsafe" ) func ...