python、Django开发备忘
一、Django安装,下载Django安装包。(注:mod_python模块不再支持Django1.5以上版本)
1) 首先需要在YaST中安装 python-setuptools包,然后执行安装
# python setup.py install
# python
>> import django
>> django.VERSION
开启SetEnv模块,或在yast中开启。(注,我没找到)
# sudo a2enmod env
2) 创建项目 phinfo:
# cd /srv/www/htdocs
# django-admin.py startproject phinfo
开启测试服务器命令为# python manage.py runserver注:默认端口为8000
# cd phinfo
# python manage.py runserver 10.120.65.10:8000
二、安装mod_wsgi
1) 先安装apache2开发包,下载mod_wsgi-4.5.6.tar.gz
# tar zxvf mod_wsgi-4.5.6.tar.gz
# cd mod_wsgi-4.5.6
# python setup.py install
2) wsgi配置,注意:首先要在http服务配置中禁用mod_python。
首配置httpd.conf,先loadmodule wsgi_module /somepath/mod_wsgi.so
然后再httpd服务器中激活
# sudo a2enmod wsgi
接下来在httpd.conf中配置phinfo项目:
# cd /etc/apache2/
# vi http.conf
增加以下内容:
WSGIScriptAlias /phinfo /srv/www/htdocs/phinfo/phinfo/wsgi.py
WSGIPythonPath /srv/www/htdocs/phinfo
<Directory /srv/www/htdocs/phinfo/phinfo>
<IfModule mod_access_compat.c>
Order allow,deny
Allow from all
</IfModule>
</Directory>
编辑 /srv/www/htdocs/phinfo/phinfo/wsgi.py 如下:
# filename django.wsgi
import os,sys
os.environ.setdefault('DJANGO_SETTINGS_MODULE','phinfo.settings')
os.environ['PYTHON_EGG_CACHE']='/tmp'
from django.core.wsgi import get_wsgi_application
application=get_wsgi_application()
3) 最后进入项目,编辑urls.py、views.py等开始项目开发。
views.py:
from django.http import HttpResponse,Http404
import datetime
def hello(req):
return HttpResponse("<h1>Hello World, It is phinfo.</h1>")
def homepage(req):
return HttpResponse("This is phinfo's Homepage")
urls.py:
from django.conf.urls import url
#from django.contrib import admin
from phinfo.view import hello,homepage
urlpatterns = [
url(r'^hello/$', hello),
url(r'^$', homepage),
]
调用: http://127.0.0.1/phinfo/hello .......
三、静态资源配置
1) 创建静态文件目录
在/srv/www/htdocs/phinfo下创建目录 static,目录下开设 css、img、js等静态文件目录。
2) 在httpd.conf中配置
Alias /static /srv/www/htdocs/phinfo/static
<Directory /srv/www/htdocs/phinfo/static>
<IfModule mod_access_compat.c>
Require all granted
</IfModule>
</Directory>
3) 配置settings.py
STATIC_URL = '/static/' #此值应与httpd.conf中配置相同
4) 静态文件使用
{% load static %}
<img src="{% static 'img/01.jpg' %}" alt="img01" >
四、基本模板配置
1) 在/srv/www/htdocs/phinfo开设模板目录 templates,可以开子目录分类,如html。
2) 编辑settings.py,更改TEMPLATES 的DIRS项。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR,'templates'),
],
...
},
]
3) 在templates/html下编辑base.html,以及current_datetime.html。
基本模板base.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
{% load static %}
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block image %} {% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
<html>
实际扩展模板current_datetime.html:
{% extends "html/base.html" %}
{% load static %}
{% block title %} The current time {% endblock %}
{% block content %}
<p> It is now {{ current_date }}. </p>
{% endblock %}
{% block image %}
<p>{% static 'img/01.jpg' %}</p>
<img src="{% static 'img/01.jpg' %}" alt="img01" >
{% endblock %}
4)模板应用,编辑views.py
from django.http import HttpResponse,Http404
import datetime
from django.template import loader,Context,RequestContext
from django.shortcuts import render_to_response
def current_datetime(req):
current_date = datetime.datetime.now()
return render_to_response('html/current_datetime.html',locals())
五、新建应用
1)在phinfo下新建应用phadmin
# django-admin.py startapp phadmin
2) 编辑settings,配置INSTALLED_APPS 。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
‘phadmin’,
]
3) 编辑views.py,urls.py
views.py:
from django.shortcuts import render
from django.http import HttpResponse,Http404
import datetime
from django.template import loader,Context,RequestContext
from django.shortcuts import render_to_response
def adminhello(req):
return HttpResponse("<h1>Hello World, It is phinfo/phadmin.</h1>")
def adminhomepage(req):
return HttpResponse("This is phinfo/phadmin's Homepage")
urls.py:
from django.conf.urls import url
#from django.contrib import admin
from phinfo.view import hello,homepage,current_datetime,ctime
from phadmin.views import *
urlpatterns = [
url(r'^ctime/(\d{1,2})/$', ctime),
url(r'^current_datetime/$', current_datetime),
url(r'^hello/$', hello),
url(r'^$', homepage),
url(r'^phadmin/hello/$', adminhello),
url(r'^phadmin/$', adminhomepage),
]
4)调用
http://.../phinfo/phadmin/hello
5)url中include的使用
phadmin下urls.py:
from django.conf.urls import url
from phadmin import views
urlpatterns = [
url(r'^hello/$', views.hello),
url(r'^$', views.homepage),
url(r'^infolist/$', views.infolist),
url(r'^infoajax/$', views.infoajax),
]
在phinfo下的urls.py:
from django.conf.urls import url,include
from django.contrib import admin
from phinfo.view import hello,homepage,current_datetime,ctime
urlpatterns = [
url(r'^ctime/(\d{1,2})/$', ctime),
url(r'^current_datetime/$', current_datetime),
url(r'^hello/$', hello),
url(r'^$', homepage),
url(r'^phadmin/', include('phadmin.urls')),
url(r'^admin/', admin.site.urls),
]
六、数据库
1) 配置数据库,更改setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'phinfodb',
'USER': 'phinfo',
'PASSWORD': '85124206',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
2) 根据数据库生成Models,注意中文表名生成会出错,另外所有表都应有一主键。可以新建一app名为model,在model下生成models.py
# python manage.py inspectdb > model/models.py
3) 数据库查询操作
查询所有: Phinfo.objects.all()
查询一个记录:Phinfo.objects.get(name=name)
查询满足指定条件记录:
Phinfo.objects.filter(name=name) #等于name_exact,名称严格等于abc
Phinfo.objects.filter(name__iexact=’abc’) #名称为abc,但不区分大小写
Phinfo.objects.filer(name__contains=’abc’) #名称中包含’abc’,区分大小写
Phinfo.objects.filer(name__icontains=’abc’) #名称中包含’abc’,不区分大小写
Phinfo.objects.filer(name__regex=’^abc’) #正则表达式
Phinfo.objects.filer(name__iregex=’abc’) #正则表达式,不区分大小写
Phinfo.objects.exclude(name__contains=’abc’) #配出名称中包含’abc’
Phinfo.objects.filer(name__contains=’abc’).exclude(age=23) #名称中包含’abc’,排除年龄是23的
七、Ajax
1) @csrf_exempt标签,避免csrf认证引起的403错误。JsonResponse参数为一个字典列表,这时一定要设置safe=False。
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect,csrf_exempt
@csrf_exempt
def infoajax(req):
infolist= Phinfo.objects.all()[20:30]
infos = []
for info in infolist:
info_dict = {}
info_dict['id'] = info.id
info_dict['title'] = info.title
info_dict['lb'] = info.lb
infos.append(info_dict)
return JsonResponse(infos,safe=False)
urls.py:
from django.conf.urls import url
from phadmin import views
urlpatterns = [
url(r'^hello/$', views.hello),
url(r'^$', views.homepage),
url(r'^infolist/$', views.infolist),
url(r'^infoajax/$', views.infoajax),
]
2) 客户端
$(document).ready(function() {
//getInfos();
$.post (
'infoajax/', #注意调用url
{},
function(data) {
var json = eval(data);
$('#infodiv').html('');
$('#infodiv').append('<ul>');
for(i=0;i<json.length;i++) {
$('#infodiv').append('<li>' + json[i].title +'</li>');
}
$('#infodiv').append('</ul>');
}
);
});