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>');
}
);
});