我这也是边学边写,大家一起吧。参考的资料有点多,但都不太完全,只能依据理解自己把它集合在一起。
首先,安装python就不说了,我用的是anaconda,我在找了很久走了很多弯路之后才找到,这是一个python的科学环境,它很强大,集成了各种python所需要的库,使用的版本为anaconda2,对应的python是python2.7。(它在安装的时候环境变量会自己装好)
另外,它是同时支持2.x和3.x的,想要再继续装python3.x和了解anaconda用法的,可以参考:http://python.jobbole.com/86236/。
我用的是Win7,如果用Linux/Unix的话,就参考这个视频:
http://www.imooc.com/video/8914,不会有我的问题那么多
接下来就是Django的环境的搭建:
一、安装Django
1、首先,anaconda里面没有带Django,我们打开这个:
2、然后,打开是这样的,长得和cmd差不多,我是把anaconda安装在了D盘,然后第二个是你接下来的操作都在这个文件夹下。
3、那我现在要安装包的话,先不用管它,直接安装,用命令:conda+操作+安装包名。conda命令很强大,它可以实现在cmd里实现的任何命令,当然也可以当pip使用。这个conda和pip差不多,命令也类似,只不过将pip改成了conda而已,操作指的是install/uninstall/update这类。
4、我们安装Django,在后面直接输入:conda install Django,然后等待即可。因为我已经安装过了,这里就不放图了。
5、安装完,你打开python/ipython,anaconda里面有,然后输入import Django,运行,如果没出错就是成功了。
6、有些人可能用的不是这个,直接用的python,如果需要,请在path里加上 “;D:/Python/Lib/site-packages/django/bin”,D盘是我安装的路径,配置它可以在需要管理Django项目的时候不用输入很长很长的文件名。
二、创建Django项目
1、如果你不介意你的项目存在C盘,可以跳过这一步,否则我建议最好安装在非系统盘,我放在了Anaconda/Scripts文件夹下,了解python的童鞋都知道,这是用来放可执行的文件的。
2、那么,在prompt(就是那个和cmd差不多的)里我们先输入d:(这是我的盘),你们依据安装的目录随意,这个命令是用来切换到D盘目录下,不同目录之间切换不需要cd命令,只需输入盘符即可。
第一条命令的结果显示在第二条的cd之前,此时已经是在D盘目录下了,(从cd开始是另一条命令,这条不管,因为我已经搭好了环境,这是我搭好的环境目录)
3、然后输入cd D:\Anaconda2\Scripts切换到该目录下,我看好像可以直接输入目录名,而不用输入完整的路径,这里我不知道,我也没试验,你们可以自己试一下。
//如果你们没有装anaconda,那么大概是这样子的:
这图是从http://blog.csdn.net/ryanho84/article/details/3838289734盗的,我也参考了一些他的。34是指python3.4版本,第二条就是我刚刚说的那个直接输入目录名的。
4、创建项目,输入:django-admin startproject mysite
(因为我之前创的忘了截图,只好盗用一下这位仁兄的。)
mysite是你的项目名,如图中的myproject,前面是固定的命令,我创建的名字是web。
如果执行完没有出错,则是成功创建了,我的工程名叫web,在Scripts下会生成一个web目录,目录中还有一个同名的web目录和一个manage.py文件,如图
也可以输入tree命令,即可查看内容的树形结构图:
它的区别在于它的工程名叫blog,而我的是web
图片来源:
http://growth-in-action.phodal.com/#django%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%BA%94%E7%94%A8,学Linux的童鞋可以参考这篇文章。
第一个web目录我们暂且叫它工程文件,以区别第二个,第二个web目录存放了相关的工程文件, manage.py是用来启动web服务器的。
web目录的相关配置:
(也是参考上面那个链接的)
这个时候就可以启动了,启动命令:python manage.py runserver
但是当时我并没有成功,因为端口被占了,默认的端口是8000端口10013就是端口被占,而我之后查过,8000一般是被酷狗给占了(如果你有的话)。
那么有三个解决办法:
1、别听歌了,把酷狗给关了,关掉进程。
2、如果你不想关掉酷狗,我Google了一下,把端口号改成8080即可。
即输入:python manage.py runserver 0.0.0.0:8080即可
2、如果不是酷狗,输入命令,taskkill /f /t /im 程序名。
这里有两个命令,“|”号前面的命令是查看所有端口,而 后面那个可以指定端口号,直接查看指定端口是被什么给占用了,而它这个是被3180这个进程给占了,打开资源管理器或者输入tasklist|findstr “3108”可以查看,而结束就是taskkill /pid 3108,而如果你知道是什么程序就用taskkill /f /t /im 程序名。
参考来源:https://my.oschina.net/catroll/blog/163447
3、运行时在python manage.py runserver后加上IP和端口号。
python manage.py runserver 0.0.0.0:8000
//如果不加0.0.0.0:8000,默认是127.0.0.1:8000,且只能本机访问。默认是长这样的。
端口号被占了看下面view视图的实现里的第5点,
方法就是:python manage.py runserver 端口号
三、创建视图文件
我看了一下网上的教程,有些是在建完项目直接就建APP,而有的教程里并没有,我在某个网上看到:项目是针对一个特定的 Web 网站相关的配置和其应用的组合。一个项目可以包含多个应用。一个应用可以在多个项目中使用。链接忘了。
后来发现,不管有没有建APP,都可以在网站上显示内容。
而创建APP的作用主要是,这个应用可能是一个博客,一个网站,建立了它在运行的时候就不单单只是显示It worked!了,而是一个完整的网站的内容。
我买了一本《python高效开发实战》,里面有python的四大主流框架,包括Django,然后参考了一下http://jingyan.baidu.com/article/84b4f565d09bf360f6da32b3.html。
这个是未创建工程前的:
1、1、打开web/web目录,创建一个view.py文件(对,自己创建,它本来下面只有四个文件,没有它,它和web/blog/views.py有区别)然后输入:
#coding:utf8
from django.http import HttpResponse
def hello(req):
return HttpResponse('hello world!')
2、然后打开web/web/urls.py,修改:
先增加一行:
from web.view import hello #从web/view.py导入hello函数
然后在urlpatterns中加入一行url(r’^hello/’,hello),这样就可以了。
#那个include函数可以导入也可以不用
三、创建工程/应用
1、首先,跳转到第二个web目录下,命令:cd web
2、创建工程的命令:python manage.py startapp blog
//blog是我创建的工程名字
这是我的目录位置和创建APP的命令:
,没出错即成功
blog在web工程下,和web目录同级,以下是blog的内容
结构大概是这样:
解释一下:
1、其中有一个init.py的文件,另外在blog的APP目录下也有一个,它里面都是没有内容的,只是使得这个APP是一个python包。
2、admin.py:管理站点模型的声明文件,默认为空。
3、apps.py:应用信息定义文件
算了,懒得打,用手机把书上的拍一下好了,在电脑上也没找到。
依次是:init.py、admin.py、apps.py、migrations包、models.py、tests.py、views.py,中文你们应该看得清。
四、创建APP后view视图的实现
1、打开web/blog/views.py,它打开来是这样的:
2、然后建立一个路由响应函数,在web/blog下创建一个views.py文件,管理应用APP中的所有url映射,加入以下内容:
from django.http import HttpResponse
def hello(req):
return HttpResponse('hello world!')
然后是这个样的:
我们定义了一个hello()函数,简单地返回一条被HttpResponse()封装的hello信息。
第一个参数必须是request或者req,与网页发来的请求有关,可以包含get或post的内容,函数返回一行hello world!到网页。
参考来源:http://jingyan.baidu.com/article/8ebacdf0ce434a49f65cd5d2.html
另外,这里要注意,别搞错,因为这个我出了问题怎么都解决不了。我是因为之前资料不完整,然后将本该是web/blog/views.py和urls.py的内容分别写在了web/views.py和urls.py里。而这几个是有区别的,web/urls.py是自带的,后面会用到这个文件。生成web的同时自动产生的,而web/blog/urls.py是要我们自己创建的。
3、然后我们打开web/blog下的urls.py 文件,绑定 URL 与视图函数。
因为我用的书使用的是2.7版本的,但是我在网上看到的似乎都是3.x版本的,两个都写吧。
python2.7:
#coding:utf8 #python2.x中这个不能少,另一种方式是-*-coding:utf8-*-
#Django中的所有路由映射都由这个url()生成
from django.conf.urls import url
#导入web/blog/view.py模块
from . import views
#该关键变量是一个列表,保存所有由url()函数生成的路由映射。
urlpatterns = [
#将所有路由映射到views.py中的hello函数
url(r'',views.hello),
]
------------------------------------------------------------
python3.4:
#这里其实需要导入django.conf.urls下的三个模块,patterns,urls,include,所以也可以写from django.conf.urls import patterns,urls,include,导入*是为了麻烦
from django.conf.urls import *
#web.view就是导入web文件夹下的view.py,hello即里面使用的函数名
#从这里开始跟python2.7有些不同
from web.view import hello
#3.4好像是用的patterns这个函数,而2.7是列表,不用它,所以比2.7多了一个要导入的模块
urlpatterns = patterns("",
('^hello/$', hello),
)
4、这个时候就切换到web/urls.py了,就是我刚刚说的容易错的地方,千万别搞错
里面默认是这样的:
然后我们往里面加,声明对应用APP中urls.py文件的引用:
from django.conf.urls import include
然后在urlpatterns中增加一项:
#url()的第一个参数用正则表达式来表达url路由,^blog/表示以blog开通的路由
url(r'^blog/',include('blog.urls')),
#书上的解释是:在urlpatterns增加这个blog/路径,将其转接到app.urls包,即web/blog/urls.py文件。这样通过include()函数就将两个urlpatterns连接了起来。
#这里的include函数可以省略,现在已经输出的是hello函数的内容了,但是若是有其他函数导入则不能省略,会找不到的。但是如果没有其他函数,只有hello函数,就可以。
不懂正则的去看看python的正则,推荐几个:
1、http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(这个是我当时看的,里面的图显得很清楚)
2、http://www.cnblogs.com/chuxiuhong/p/5885073.html
3、http://www.jb51.net/article/15707.htm
4、http://www.runoob.com/python/python-reg-expressions.html
5、先启动内置服务器,在anaconda的命令行里输入命令(在web工程下,因为manage.py 在web目录下),总共有三种方法:
python manage.py runserver
python manage.py runserver 8080 #修改端口号,默认的是8000
(0.0.0.0表示绑定本机的所有IP)
python manage.py runserver 0.0.0.0:8000 #服务器监听任意IP的8000端口
参考来自:http://blog.chinaunix.net/uid-10915175-id-5060795.html
6、然后这个时候你打开浏览器输入127.0.0.1:8080/blog(8080是我设置的端口号,blog是我的APP名,你对应修改成自己的就行了)就成功了,或者localhost:8080。如图:
如果你输入的是127.0.0.1:8080,没有APP名的话,打开来是page not found ,如下图:
原因我们看命令行,你没有指定跳转的目录就会打开它的根目录,它的根目录就是上面那个页面。
当然,出现这个页面已经成功了。虽然我的不知道为什么相比其他人的多了you have 13 unapplied migration…什么的。
看http://www.cnblogs.com/zrl66/p/Django.html的解决办法:
我们在命令行输入这么一句命令:python manage.py migrate,如图,每条都OK了就可以了。
然后你再输入python manage.py runserver的时候就不会有了。
后来我又看到出现page not found的解决方法有两个:
一是在端口号后加上\blog,另外还有一种方法,参照:http://jingyan.baidu.com/article/84b4f565d09bf360f6da32b3.html
仍旧在web/web/view.py文件增加创建另一个函数:
def homepage(req):
return HttpResponse(‘homepage!’)
然后修改web/web/urls.py,做一些修改:
1、先导入homepage函数,在第三行后面加上就行了。
2、加上上面两个函数
现在输入127.0.0.1:8080就可以打开了,不用在后面加\blog了。
这里blog和hello他们输出的内容是一样的,因为目前blog/urls.py里只有一个hello函数,他们输出的内容是一样的,只是前面以示区别。
但是如果注释掉,输入127.0.0.1:8080\blog就打不开了。
如果端口被占,用第二种,你只要更改端口号即可。
至此,花了两个晚上终于成功了。
以上均为亲测,除了创建工程之后显示的页面之后都成功了,但是因为之前出错了,所以没显示。后来直接进行的下一步。
另外,补充一点,之前我的出了这个问题,就是不管怎样,都报这个错:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 7: ordinal not in range(128) 。
我之前在网上查的时候,解决方案,大多是这样的,都是在该python文件的前面加上如下几句:
import sys
reload(sys)
# Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 (‘utf-8’)
sys.setdefaultencoding
原因是:python的str默认是ascii编码,和unicode编码冲突。
但是听说这种方式已经不推荐使用了,推荐使用以下方式 :xxx.decode(“utf-8”) 。
参考来源:https://www.zybuluo.com/zwenqiang/note/21851
或者在你需要使用中文的地方前面加上u.Python2默认的字符串编码是str。
如果你确实是因为这个编码的原因,打开D:\Anaconda2\Lib\mimetypes.py,在254行左右有句default_encoding = sys.getdefaultencoding(),在它前面加上这句:
if sys.getdefaultencoding() != ‘utf8’:
reload(sys)
sys.setdefaultencoding(‘utf8’)
如图:
改完之后就没事了。
但是我的不是这个原因,因为加了也没用,后来发现就是出了我前头出现的问题,我把web/blog和web/web下的urls.py文件搞混了,重新弄好之后就搞定了。