本篇只是入门简介,内容很简单,而且基本是借鉴RUNOOB的教程.不过因为版本不同有些命令不一样,而且过程中,遇到了点问题,加了写自己的想法.
一: 简介 二: 安装 三: django-admin命令 四: 创建一个新项目 五: 启动服务器
六: 创建模板 七: django模型,数据库的操作 八: Django表单 九: DjangoAdmin管理工具
一: 简介
python下有许多不同的web架构.知呼上的大神们都众说纷纭的发表了意见和对比,如下
https://www.zhihu.com/question/20706333
不过不可否认Django是非常重量级常用的一种.用python完成的开放源代码的web应用架构.
采用了MVC的软件设计模式,M模型,V视图,C控制器.这几个概念后面具体实现的时候会经常出现.
二: 安装
我觉得这个安装起来还是满坑爹的.版本的对应很重要.
Django 版本对应的Python 版本:
Django 版本 |
Python 版本 |
1.8 |
2.7, 3.2 , 3.3, 3.4, 3.5 |
1.9, 1.10 |
2.7, 3.4, 3.5 |
1.11 |
2.7, 3.4, 3.5, 3.6 |
2.0 |
3.5+ |
我的平台是ubuntu14.04,python2.7 (当然我也安装了python3)
我为了省事直接:
sudo apt-get install python-django
这里注意下,apt-get 貌似库没有更新,默认安装的是django1.6.11版本的.版本不是很新.
~/HelloWorld$ python -c "import django; print(django.__path__);print(django.VERSION)"['/usr/lib/python2.7/dist-packages/django']
(1, 6,11, 'final', 0)
~/HelloWorld$django-admin --version
1.6.11
>>>import django
>>>django.get_version()
'1.6.11'
https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04
各种方式安装:
get-apt:
sudo apt-get update
sudo apt-get install python-django
方便,但是落后于官方最新版本,看到有老外抱怨
pip:
sudo apt-get install python-pip
sudo pip install django
virtualenv:
sudoapt-get install python-pip
sudopip install virtualenv
mkdir~/newproject
cd~/newproject
virtualenvnewenv
sourcenewenv/bin/active
sudopip install django
git:
sudo apt-get install python-pip
gitclone git://github.com/django/django ~/django-dev
sudopip install -e ~/django-dev
三: django-admin命令
安装完成之后就了可以用django-admin.py来管理了.
$:/usr/local/bin$cat django-admin.py
#!/usr/bin/python
from django.coreimport management
if __name__ =="__main__":
management.execute_from_command_line()
$:~/HelloWorld$django-admin.py
Usage:django-admin.py subcommand [options] [args]
Options:
-v VERBOSITY,--verbosity=VERBOSITY
Verbosity level; 0=minimal output, 1=normal output,
2=verbose output, 3=very verbose output
--settings=SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provided, the
DJANGO_SETTINGS_MODULE environment variable will be
used.
--pythonpath=PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Raise on exception
--version show program's version number and exit
-h, --help show this help message and exit
Type'django-admin.py help ' for help on a specificsubcommand.
Availablesubcommands:
[django]
check
cleanup
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
runfcgi
runserver
shell
sql
sqlall
sqlclear
sqlcustom
sqldropindexes
sqlflush
sqlindexes
sqlinitialdata
sqlsequencereset
startapp
startproject
syncdb
test
testserver
validate
四: 创建一个新的项目
~$django-admin.py startproject HelloWorld
~/HelloWorld$tree
.
|-- HelloWorld
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py
HelloWorld:项目的容器。
manage.py:一个实用的命令行工具,可让你以各种方式与该Django项目进行交互。
HelloWorld/__init__.py:一个空文件,告诉Python该目录是一个Python包。
HelloWorld/settings.py:该Django项目的设置/配置。
HelloWorld/urls.py:该Django项目的URL声明;一份由Django驱动的网站"目录"。
HelloWorld/wsgi.py:一个WSGI兼容的Web服务器的入口,以便运行你的项目。
五: 启动服务器
~/HelloWorld$ python manage.py runserver 10.169.22.41:8000
#让其它电脑可连接到开发服务器,8000 为端口号。如果不说明,那么端口号默认为 8000
Validating models...
0 errors found
May 30, 2018 - 10:32:32
Django version 1.6.11, using settings 'HelloWorld.settings'
Starting development server at http://10.169.22.41:8000/
Quit the server with CONTROL-C.
[30/May/2018 10:32:36] "GET / HTTP/1.1" 400 26
Validating models...
##这里页面出现Bad Request (400)的报错
#做了如下的更改就可以了.
0 errors found
May 30, 2018 - 10:35:30
Django version 1.6.11, using settings 'HelloWorld.settings'
Starting development server at http://10.169.22.41:8000/
Quit the server with CONTROL-C.
[30/May/2018 10:35:37] "GET / HTTP/1.1" 200 1757
项目启动之后会一直检测
,程序不会自动退出.项目中如果代码有改动,服务器会自动监测代码的改动并自动重新载入,所以如果你已经启动了服务器则不需手动重启。
改动1:
启动django后,不能访问,报400错误。
原因:没有开启允许访问
处理:编辑HelloWorld目录下settings.py,把其中的
ALLOWED_HOSTS=[]改成ALLOWED_HOSTS=['*']##* 表示任意地址。
改动2:
新建视图文件:
~/HelloWorld/HelloWorld$cat view.py
from django.httpimport HttpResponse
def hello(request):
returnHttpResponse("Hello World!")
绑定视图文件
url与视图函数:
~/HelloWorld/HelloWorld$cat urls.py
fromdjango.conf.urls import patterns, include, url
from . import view
urlpatterns = [
url(r'^$',view.hello),
]
改动3:
url(r'^$',view.hello),
>>>>
url(r'^hello$',view.hello)
>>>
则打开http://10.169.22.41:8000/ 汇报错, http://10.169.22.41:8000/hello 则可以正常显示.
六: 创建模板
使用模板也就是一个html之类的文本文件来输出数据,而不是像上面的例子中把数据和视图放在了一起.从而实现数据与视图分离。
1: 在HelloWorld 目录底下创建templates 目录并建立hello.html文件.
{{ hi}}
2:在settings.py里面说明模板文件的路径,我是直接添加如下内容
TEMPLATE_DIRS = (
'/home/juliet/HelloWorld/templates',
)
3:修改view.py文件,添加一个新的对象,用来向模板提交数据.
context 字典中元素的键值"hi" 对应了模板中的变量"{{hi}}"。
from django.shortcuts import render
def hello1(request):
context = {}
context['hi'] = 'Hello Juliet!'
return render(request, 'hello.html', context)
我看有些版本是添加如下:
"""
TEMPLATE = [
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
# 'DIRS':[BASE_DIR+"/templates",],
# 也有可能是 'DIRS': [os.path.join(BASE_DIR,'HelloWorld/templates')],
'DIRS':['/home/juliet/HelloWorld/templates',],
'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',
],
},
},
]
"""
没有用,可能是因为版本的问题,识别不了.改成如下就可以了
https://stackoverflow.com/questions/1926049/django-templatedoesnotexist
TEMPLATE_DIRS = (
'/home/juliet/HelloWorld/templates',
)
就可以了,在http://10.169.22.41:8000/hello显示hello juliet
模板的继承:
模板可以用继承的方式来实现复用。
1: 接下来我们先创建之前项目的templates 目录中添加base.html 文件
titleof web(ooop.com)
helloworld!
mydjango test
{% blockmainbody %} #名为mainbody 的block 标签是可以被继承者们替换掉的部分。
original
{% endblock%} #标签告诉模板引擎,子模板可以重载这些部分。
2: 修改hello.html文件
{% extends"base.html" %} #hello.html继承了base.html文件.
{% block mainbody%}come from base.html
#这里用来替换base.html中block部分
{% endblock %}
七: django模型,数据库的操作
Django对各种数据库提供了很好的支持,包括Mysql,SQLite, Oracle等,为这些数据库提供统一调用的API.工作中应用的是Mysql.
1: 在settings.py里面设置DATABASES数据库信息
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME': 'database1', #对应你的database的名字,已存在的
'USER': 'root', #数据库用户名
'PASSWORD': '123', #密码
'HOST': 'localhost', #数据库server
'PORT': '3306' #接口默认
}
}
2: 定义模型,创建APP
Django规定要使用模型就必须创建一个app,所以如下我们准备创建一个TestModel的app.
~/HelloWorld$django-admin.py startapp TestModel
|--TestModel
| |-- __init__.py
| |-- admin.py
| |-- models.py
| |-- tests.py
| `-- views.py
自动生成了如上的一些文件.
3:修改app里面的models.py文件
from django.db import models
# Create your modelshere.
classTest(models.Model):
name =models.CharField(max_length=20)
#其中Test代表将会在页面上显示的数据表名,继承了models.Model
4:在settings.py文件里面添加新建的APP
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', #新添加
)
5: 运行创建表结构
python manage.py syncdb
这里有几个方面需要注意:
(1)有些地方用的是如下命令创建表结构(1.7以后的版本)
python manage.py migrate
python manage.py makemigrations TestModel
python manage.py migrate TestModel
但是我当前的Django(1.7以前的版本)不是用这个命令的:
~/HelloWorld$python manage.py migrate
Unknown command:'migrate'
Type 'manage.pyhelp' for usage.
https://stackoverflow.com/questions/12843550/manage-py-unknown-command-migrate
(2)确保此时你的mysql服务是开启的状态.
~/HelloWorld$python manage.py syncdb
File"/usr/lib/python2.7/dist-packages/MySQLdb/connections.py",line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError:(2002, "Can't connect to local MySQL server through socket'/var/run/mysqld/mysqld.sock' (2)")
#这个报错查找了一圈发现是因为我的mysql没有启动...
sudo/etc/init.d/mysql start
mysql -u root -p 123
~/HelloWorld$python manage.py syncdb
Creating tables ...
Creating tabledjango_admin_log
Creating tableauth_permission
Creating tableauth_group_permissions
Creating tableauth_group
Creating tableauth_user_groups
Creating tableauth_user_user_permissions
Creating tableauth_user
Creating tabledjango_content_type
Creating tabledjango_session
Creatingtable TestModel_test
You just installed Django's auth system, which means you don't have any superusersdefined.
Would you like tocreate one now? (yes/no): yes
Username (leaveblank to use 'juliet'):
Email address:
Password: 123
Password (again):123
Superuser createdsuccessfully.
Installing customSQL ...
Installing indexes...
Installed 0object(s) from 0 fixture
syncdb-vs-migration
http://ruddra.com/2015/09/17/syncdb-vs-migration/
此时在你规定的数据库database1里面就可以看到新建的table TestModel_test了.6: 数据库操作
添加数据
(1)在HelloWorld 目录中添加testdb.py 文件,其实是对数据库的操作,创建对象,save添加的操作.
相当于对Mysql执行了INSERT.
from django.httpimport HttpResponse
from TestModel.models import Test
def testdb(request):
test1 =Test(name='runoob')
test1.save()
return HttpResponse("data added ok
")
此时你登录数据库查看,就可以看到新添加的信息了.
mysql> select *from TestModel_test;
+----+--------+
| id | name |
+----+--------+
| 1 | runoob |
+----+--------+
1 row in set (0.00sec)#说明数据添加成功了
(2) 修改urls.py
from . import view,testdb
urlpatterns = [
url(r'^hi$',view.hello1),
url(r'^testdb$', testdb.testdb),
]
打开页面效果:
下面有更多的数据库相关操作:获取数据;更新数据;删除数据;
都是在testdb.py脚本中Test.objects这个模型管理器进行操作的.
八: Django表单
HTML表单是网站交互性的经典方式.Django对用户提交的表单数据进行处理.
HTTP协议是以”请求-回复”的方式工作的.客户发送请求时,可以在请求中附加数据.服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务.
GET方法:
视图显示和请求处理分成两个函数处理.search_form.html和search.py
1:新建search.py文件,用于接收用户请求
from django.httpimport HttpResponse
from django.shortcuts import render_to_response
#表单
def search_form(request):
return render_to_response('search_form.html')#接收请求数据,并响应
defsearch(request):
request.encoding='utf-8'
if 'q' inrequest.GET:
message = 'what you are searching is: '+ request.GET['q']
else:
message = 'your ticket is empty'
return HttpResponse(message)
2: 在模板目录templates 中添加search_form.html 表单
runoobtest
3: 修改urls.py文件
from django.conf.urls
import url from .import view,testdb,search
urlpatterns = [
url(r'^hi$',view.hello),
url(r'^testdb$',testdb.testdb),
url(r'^search-form$',search.search_form),
url(r'^search$',search.search),
]
访问地址http://127.0.0.1:8000/search-form 并搜索
有时候会遇到类似下面的错误.可能就是自己在url.py里面忘记了import对应的脚本
Django Version: |
1.6.11 |
---|---|
Exception Type: |
NameError |
Exception Value: |
name 'search' is not defined |
POST方法:
提交数据更常用的是POST方法.下面使用该方法,并用一个url和处理函数.同时显示视图和处理请求.
1:在tempaltes里面创建post.html文件
runoobpost test
{{rlt }}
#我们增加一个rlt 记号,为表格处理结果预留位置。
2: 创建search_post.py并使用search_post 函数来处理POST 请求
from django.shortcuts import render
from django.views.decorators import csrf
def search_post(request):
ctx={}
if request.POST:
ctx['rlt']=request.POST['q']
return render(request, "post.html", ctx)
3: 修改urls.py文件
from django.conf.urls import url
from . import view,testdb,search,search2
urlpatterns = [
url(r'^hello$',view.hello),
url(r'^testdb$',testdb.testdb),
url(r'^search-form$',search.search_form),
url(r'^search$',search.search),
url(r'^search-post$',search2.search_post), ]
九: DjangoAdmin管理工具
Django提供了基于web的管理工具.django.contrib是一个庞大的功能集,django的自动化管理工具是django.contrib的一部分,在settins.py的installed_apps里面可以看到.
1: 修改urls.py,激活管理工具.
from django.contrib import admin
urlpatterns = [url(r'^admin/', admin.site.urls), ]
打开http://10.169.22.41:8000/admin/登录界面,需要用户名密码.
superuser这个貌似在前面生成app的时候创建过了,直接登录
如果之前没有创建,可以通
python manage.py createsuperuser #来创建
2: 用admin来管理数据模型.
为了让admin 界面管理某个数据模型,我们需要先注册该数据模型到admin。比如,我们之前在TestModel 中已经创建了模型Test 。修改TestModel/admin.py:
from django.contrib import admin
from TestModel.models import Test
# Register your models here.
admin.site.register(Test)
点击进去的话,是之前在database1里面TestModel_test里面添加的数据.