学习使用Django有一段时间了,期间也做过一些记录,希望能帮到大家!
2017-08-16
#Django
python manage.py startapp Users #生产新的应用
2017-08-19`
#Django
django-admin startproject 项目名称 #创建项目
python manage.py startapp app名称 #创建app
#settings配置
INSTALLED_APPS=(
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app', #将自己的app添加进来
)
#可在此修改为mysql数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname', #数据库名称
'USER': 'root',
'PASSWORD': 'root',
'HOST':'', #留空则为:localhost
'PORT':'3306',
}
}
#或sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
#pymysql需要在app项目名下的__init__.py文件添加:
import pymysql
pymysql.install_as_MySQLdb()
#配置templates路径
TEMPLATES = [
{
'........'#在[]里面添加此句
'DIRS': [os.path.join(BASE_DIR,'templates')],
'........'
}
]
#配置static路径
STATIC_URL='/static/'
STATICFILES_DIRS=(
#告诉django static的路径
os.path.join(BASE_DIR,"static"),
)
python manage.py runserver #运行项目
#同步数据库
python manage.py syncdb #第一种方式,并可设置admin用户,密码
python manage.py makemigrations #第二种方式,设置models后用这种
python manage.py migrate
2017-08-22`
'''个人博客网站,项目名称:mblog,默认sqlite3数据库'''
'''1.创建项目,创建app,配置settings.py
django-admin startproject mblog #创建项目
python manage.py startapp mainsite #创建App
#配置settings.py
INSTALLED_APPS=[...,'mainsite',] #把App加入列表
LANGUAGE_CODE='zh-CN'
TIME_ZONE='Asia/Beijing' #设置时区
python manage.py migrate #保存设置
'''2.创建博客数据表'''
#models.py定义数据模型
from django.db import models
from django.utils import timezone
class Post(models.Model):
title=models.CharField(max_length=200)
slug=models.CharField(max_length=200)
body=models.TextField()
pub_date=models.DateTimeField(default=timezone.now)
class Meta: #时间降序排序
ordering=('-pub_date',)
def __unicode__(self):
return self.title
#同步数据库
python manage.py makemigrations app(app名可写可不写)
python manage.py migrate
#Django启动admin管理界面
python manage.py createsuperuser #然后输入用户信息
#修改admin.py
from django.contrib import admin
from .models import Post
class PostAdmin(admin.ModelAdmin):
list_display=('title','slug','pub_date')
admin.site.register(Post,PostAdmin)
2017-08-26`
#Django静态页面配置
1.在settings.py加入下面语句,再在根目录下创建static文件夹
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
2.使用时需在html文件前面加入{% load staticfiles %}
3.使用举例:<img src="{% static "images/a.jpg" %}">
#在models.Model中常用的字段格式说明
字段格式 , 可用参数, 说明
AutoField #自动增长的IntegerField
BigIntegerField, , 64位大整数
BooleanField, ,布尔值,只有True/False两种
CharField, max_length字符串最大长度, 存储较短字符串
DateField,auto_now对象被存储时自动加入当前日期 auto_now_add对象被创建时才加入, 可用于datetime.date
DatetimeField, 同上, 可用于datetime.datetime
DecimalField, max_digits可接受的最大位数, 定点小数数值数据,适用于Decimal模块的实例
EmailField, max_length最长字数, 电子邮件地址格式字段
FloatField, ,浮点数
IntegerField, ,整数
PostiveIntegerField, ,正整数
SlugField, max_length, 通常用来作为网址的一部分
TextField, ,长文字格式,一般用在HTML窗体的Textarea输入项目中
URLField, max_length, 常用来记录完整的URL网址
ForeignKey 添加外键,如ForeignKey('name',on_delete=models.CASCADE)
FileField 上传文件
ImageField #继承于FileField,对上传的内容进行校验,确保是有效的图片
#各字段常用属性
null 是否接受空值,默认False
blank 是否接受存储空白内容,默认False
choices 以选项的方式(只有固定内容可选)作为此字段的候选值
default 输入此字段的默认值
help_text 字段的求助信息
primary_key 设置为KEY(主键),默认为False
unique 是否唯一,默认False
db_column 字段的名称,如未指定,则使用属性的名称
db_index 若值为True,则在表中为此字段创建索引,默认False
choices 下拉列表(下拉框)
#Django ORM常用函数及修饰词`
create() 创建一组记录,如:a=类名.objects.create(id=3,name='name')
save() 保存到数据库,如:a.save()
filter() 返回指定条件的QuerySet
exclude() 返回不符合指定条件的QuerySet
order_by() 针对某一指定字段进行排序
get() 获取指定条件的唯一元素,若没找到或不止一个就产生异常
first()/last()/all() 获取第一个元素/最后一个元素/所有的QuerySet
aggregate() 可以用来计算的聚合函数
exists() 用来检查是否存在某指令条件的记录
update() 更新某字段内容
delete() 删除指定记录
iexact 不区分大小写的条件设置
contains/icontains 设置条件为含有某一字符串就符合
in 提供一个列表,只要符合其中任何一个即可
gt/gte/lt/lte 大于/大于等于/小于/小于等于
#Template常用过滤器
addslashes 为字符串需要的地方加上转义字符
center,ljust,rjust 为字符串加上指定空格后居中,靠左,靠右对齐,如{{ msg|center:"10"}}
cut 在字符串中删除指定的子字符串,如{{msg|cut:" "}}删除空格
date 设置日期的显示格式,如{{value|date:"D d M Y"}}
default 若没有值,就使用默认值,如{{msg|default:"没有信息"}}
dictsort 为字典形式的变量排序,如{{value|dictsort:"name"}}以名字字段排序
divisibleby 测试数值是否可被指定的数整除,返回True/False,如{{value|divisibleby:5}}
escape 把字符串中的HTML标记变成显示用的字符串,如{{msg|escape}}
filesizeformat 显示文件的大小格式(KB,MB等)
first/last 只取出列表数据中的第一个/最后一个,如{{values|first}}
length 返回列表数据的长度,如{{values|length}}
length_is 测试数据是否为指定长度,如{{values|length_is:"1"}}
floatformat 以指定的浮点数格式显示数据,如{{value|floatformat:2}}两位小数
linenumber 为显示的文字加上行号,如{{msg|linenumbers}}
lower/upper 把字符串内存全部换成小写/大写
random 以随机数将前面的内容显示出来,如{{values|random}}
safe 标记字符串为安全的,不需要处理转义字符,如{{msg|safe}}
slugify 把字符串空格变成'-',让字符串可以安全放在网址栏上,如{{msg|slugify}}It's a变为Its-a
truncatechars 把过长的字符串截切成指定的长度,同时最好3个字符会转换成'...'
wordcount 计算字数,如{{msg|wordcount}}
yesno 按照值的内容为True,False,None显示对应内容,如{{value|yesno:"是,否,有可能"}}
slice 根据索引显示对应内容,如{{value|slice:'1'}},显示列表value的第一个元素,['x']
2017-08-27`
#template中的for循环
常用的参数:
cycle可用来设置隔行变色 forloop.parentloop用来存取上一层循环
forloop.counter0/counter循环计数器,从0/1开始
forloop.revcounter0/revcounter循环计数器,从最后开始,到0/1
forloop.first/last循环处于第一圈/最后一圈,才为True,其他时候为False
循环示例: #表格实现隔行变色,按序排列
{% for good in conts %}
{% if forloop.first %}
<table><tr><td>名称</td><td>类型</td></tr>
{% endif %}
<tr bgcolor="{% cycle "red" "green" "#00f" %}"> #隔行变色,红,绿,蓝
<td>{{forloop.counter0}}{{good.name}}</td>
#counter0(从0开始),counter(从1开始)是计算当前是第几个循环的计数器,现用作序号
<td>{{good.types}}</td>
</tr>
{% if forloop.last %}
</table>
{% endif %}
{% empty %}
<h3>商场目前暂无商品</h3>
{% endfor %}
#窗体的使用`
1.创建forms.py文件,创建窗体类
from django import forms #导入django的forms模块
class ContactForm(forms.Form): #创建窗体类继承forms.Form
CITY=[['北京','北京'],['GZ','广州'],['XA','西安'],] #定义下拉框的列表
user_name=forms.CharField(label='您的姓名',max_length=50,initial='李大仁') #姓名,长度50,默认为李大仁
user_pawd=forms.CharField(label="密码",max_length=20,
widget=forms.PasswordInput()) #(密码框)设置密码显示为星号
user_city=forms.ChoiceField(label='居住城市',choices=CITY) #城市的下拉框
user_school=forms.BooleanField(label='是否在学',required=False) #单选按钮
user_email=forms.EmailField(label='电子邮件') #电子邮件
user_message=forms.CharField(label='您的意见',widget=forms.Textarea) #扩展为大量文字输入字段
2.设置views.py,并把urls.py设置好,这里不再说明
from django.shortcuts import render,RequestContext,redirect
from django.template.loader import get_template
from django.http import HttpResponse
from mysite import forms
def contact(request):
if request.method=='POST':
form=forms.ContactForm(request.POST)
if form.is_valid():
message="感谢您的来信."
user_name=form.cleaned_data['user_name']#获取输入的值
user_city=form.cleaned_data['user_city']
user_school=form.cleaned_data['user_school']
user_email=form.cleaned_data['user_email']
user_message=form.cleaned_data['user_message']
else:
message="请检查您输入的信息是否正确!"
else:
form=forms.ContactForm()
template=get_template('contact.html')
requ_context=RequestContext(request)
requ_context.push(locals())
html=template.render(requ_context)
return HttpResponse(html)
3.创建contact.html文件,主要内容如下
{% if message %}
{{message}}{{user_name}}<br/>
{% endif %}
<form name='my form' action='/contact/' method='POST'>
{% csrf_token %}
<h3>写信给管理员</h3>
{{ form.as_p }}
<input type='submit' value='提交'>
<input type='reset' value='重填'>
</form>
#重定向到另一个页面`
return HttpResponseRedirect('/page/')
#在Windows使用findstr查找文件包括的字符串
findstr/s "ch08" *.py #查找当前目录下所有包括"ch08"的py文件
2017-08-28`
#使用Mysql数据库时为了防止乱码,在建库时设置默认编码utf8
create database db default charset=utf8;
2017-08-29`
#include其他整组的urlpatterns设置
my_patterns=[
url(r'^a/$',views.a),
url(r'^b/$',views.b),
url(r'^c/$',views.c),]
urlpatterns=[
url(r'^info/',include(my_patterns)),]
#URLconf的反解功能`
url(r'^post/(\d{2})$',views.post,name='post-url')
#在html页面可配置成链接
<a href="{% url 'post-url' 01 %}">Show the Post</a>
2017-09-10`分页
#一.Paginator实现分页展示功能
#views.py代码
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
def listing(request):
cont=Goods.objects.all() #获得数据库所有行
paginator=Paginator(cont,2) #每页显示2行
page=request.GET.get('page') #获得请求的页码
try:
conts=paginator.page(page)#获得页码对应的页
except PageNotAnInteger: #若请求的页码不是数字
conts=paginator.page(1)#获得第一页
except EmptyPage: #若请求的页码号超过最大页
conts=paginator.page(paginator.num_pages)#获得最后页
return render(request,'index.html',{'conts':conts,'paginator':paginator})
#index.html关键代码:
{% if conts %}
{% if conts.has_previous %} <!--如果还有上一页-->
<a href='?page={{conts.previous_page_number}}'>上一页</a>
{% else %}上一页
{%endif%}第{{conts.number}}页共{{paginator.num_pages}}页
{% if conts.has_next %} <!--如果还有下一页-->
<a href='?page={{conts.next_page_number}}'>下一页</a>
% else %}下一页
{% endif %}
{% for good in conts %}<!--循环展示此页-->
{{good.name}}
{{good.price}}
{{good.types}}
{% endfor %}
{% endif %}
二.高效分页
#views.py代码:
SIZE=3
def goodList_gx(rq):
try:
curPage = int(rq.GET.get('curPage', '1')) #第几页
allPage = int(rq.GET.get('allPage', '1')) #总页数
pageType = str(rq.GET.get('pageType', ''))#上/下页
except:
curPage=1;allPage=1;pageType='' #若有误,则给其默认值
if curPage==1 and allPage==1: #只在第一次查询商品总条数
goodCount = models.Goods.objects.count()
allPage=goodCount/SIZE if goodCount%SIZE==0 else goodCount/SIZE + 1
if pageType == 'pageDown': #下一页
curPage+=1
elif pageType == 'pageUp': #上一页
curPage-=1
if curPage < 1: curPage=1 #如果小于最小则等于1
elif curPage > allPage: curPage=allPage #若大于最大则等于最大页
startGood = (curPage - 1) * SIZE #切片开始处
endGood = startGood + SIZE #切片结束处
goods = models.Goods.objects.all()[startGood:endGood] #切片查询(效率较高)
return render(rq, 'goodList_gx.html', {'goods': goods, 'allPage': allPage, 'curPage': curPage})
#list.html关键代码:
{% if goods %}
{% for good in goods %}
{% if forloop.first %}<table border="1"> <!--如果是循环第一次-->
<tr><td>编号</td><td>名称</td><td>价格</td><td>类型</td><td>操作</td></tr>
{% endif %}
<tr bgcolor="{% cycle '#ff0' 'green' %}"> <!--隔行变色-->
<td>{{ good.id }}</td><td>{{ good.name }}</td><td>{{ good.price }}</td><td>{{ good.types }}</td>
<td><a href="/update_good/{{ good.id }}">修改</a> <a href="/delete_good/{{ good.id }}">删除</a></td>
</tr>
{% if forloop.last %}</table>{% endif %} <!--如果是循环最后一次-->
{% endfor %}
{% ifnotequal curPage 1 %} <!--如果不是第一页-->
<a href="?curPage={{ curPage }}&allPage={{ allPage }}&pageType=pageUp">上一页</a>
{% else %}上一页{% endifnotequal %} <!--否则不能点击-->
第{{ curPage }}共{{ allPage }}页
{% ifnotequal curPage allPage %} <!--如果不是最后一页-->
<a href="?curPage={{ curPage }}&allPage={{ allPage }}&pageType=pageDown">下一页</a>
{% else %}下一页{% endifnotequal %}
{% else %}
<h3>目前暂无商品</h3>
{% endif %}
2017-09-10 15:24`
Session的使用
一,settings 中的设置:
session的超时时间设置
SESSION_COOKIE_AGE=60*30 30分钟。
SESSION_EXPIRE_AT_BROWSER_CLOSE False:会话cookie可以在用户浏览器中保持有效期。True:关闭浏览器,则Cookie失效。
SESSION_COOKIE_DOMAIN 生效站点
SESSION_COOKIE_NAME cookie中保存session的名称
二,常用函数:
set_expiry(30) #设置30秒后过期
set_expiry(datetime格式) #设置指定时间点过期
set_expiry_age() #返回还有多少秒过期
set_expiry_date() #返回Session的到期时刻
get_expiry_at_browser_close()#返回关闭浏览器是否到期
示例: #设置0.001秒后过期,达到注销作用
request.session.set_expiry(0.001)
三,session的创建于取出:
request.session['name']='name'
if 'name' in request.session: #判断session是否存在'name'
name=request.session['name']
2017-09-13`
#Ajax的使用(ajax)
一.html页面关键代码:
{% load staticfiles %}
<script src="{% static 'js/jquery-1.12.4.js' %}"></script>
<script>
$(document).ready(function(){
$("#id_name").blur(function(){
var name=$("#id_name").val();
if(name==null || name==""){
$("#ajax").css('color','red').html('用户名不能为空!');
}else{
/*$.ajax({
type:"GET",
url:"/zcyz",
data:{"name":name},
success:callBack
});*/
$.get("/zcyz",{"name":name},callBack);
}
function callBack(datas){
if(datas==1){
$("#ajax").css('color','red').html('此号已被注册!');
}else{
$("#ajax").css('color','green').html('此号可以注册!');
}
}
});
});
</script>
二.views.py关键代码:
def zcyz(request):
if request.method=='GET' and request.is_ajax():
name=request.GET.get('name')
names=Users.objects.filter(name=name)
print(name)
if names:
datas=1
else:
datas=0
else:
datas=0
return HttpResponse(datas)
2017-09-1312:38`
#在网站中建立自定义标签:
"""可以把自定义标签想象成一个在Template模板中调用Python函数的方法,其中xianshi就是函数名称,第一个参数就是'|'之前的id,若还需要第2个以及第3个参数,则要以':'的方式附加到自定义标签后"""
(1)在app(mysite)目录下创建一个templatetags文件夹
(2)在此文件夹创建一个空的__init__.py文件
(3)在此文件夹创建.py文件(在此命名为mvote.py),内容如下:
from django import template
from mysite import models
register=template.Library() #创建注册用的对象
@register.filter(name='xianshi')#注册自定义标签
def xianshi(value):
try:
s=models.Users.objects.get(id=int(value)).name
except:
s=None
return s
(4)html页面的关键代码如下:
{% load mvote %}
{{ id | xianshi }}#id会被当作xianshi的参数,返回输出查询的name
2017-09-14`
Cookie的使用:
if request.session.test_cookie_worked() #判断是否支持cookie
response=HttpResponse(html) #必须先执行此段再写cookie
try:
if name: response.set_cookie('name',name)#写入cookie
except:
pass
return response
2017-09-17`
图形验证码的使用:
一.需要安装的模块有:
django-simple-captcha ,Pillow 以及six
二.settings.py的配置:
把'captcha'加入到INSTALLED_APPS区块中
三.urls.py的配置:
在urlpatterns加入:url(r'^captcha/',include('captcha.urls')),
四.在forms.py的窗体类加入如下语句(如窗体类为PostForm):
from django import forms
from captcha.fields import CaptchaField #新加的
class PostForm(forms.ModelForm):
captcha=CaptchaField() #新加入的字段
class Meta:
model=models.Post
fields=['name','pawd']
def __init__(self,*args,**kwargs):
super(UserForm,self).__init__(*args,**kwargs)
self.fields['name'].label='账 号'
self.fields['pawd'].label='密 码'
self.fields['pawd'].widget=forms.PasswordInput()
self.fields['captcha'].label='验证码' #新加的
五.html页面的配置:
(1)javascript里加入此段jQuery:
$("#id_captcha_1").attr('placeholder','输入验证码');
$("#cpt").click(function(){
console.log('click');
$.getJSON("/captcha/refresh/",
function(result){
$('.captcha').attr('src',result['image_url']);
$('#id_captcha_0').val(result['key']);
});
});
(2)form表单最后加入此段(进行验证码刷新):
<span id="cpt" style="cursor:pointer">看不清?换一张</span>
2017-09-24`
信息显示框架messages framework:
DEBUG调试 INFO信息
SUCCESS成功 WARNING警告 ERROR 错误
from django.contrib import messages
messages.add_message(request,messages.SUCCESS,'登录成功')
2017-09-24`
auth验证:
from django.contrib.auth import authenticate
from django.contrib import auth,messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
#在此只导入auth需要用到的模块,还有messages模块
#主页
@login_required(login_url='/login') #未登录则跳转
def index(request):
if request.user.is_authenticated(): #判断是否登录
message="登录成功<h3><a href='/logout'>注销</a></h3>"
return HttpResponse(message)
#登录
def login(request):
if request.method=='POST':
login_form=forms.LoginForm(request.POST)
if login_form.is_valid(): #若表单字段正确
login_name=request.POST['username'].strip()
login_password=request.POST['password']
user=authenticate(username=login_name,password=login_password)
if user is not None: #若此账号与密码正确
if user.is_active: #若此账号已经启用
auth.login(request,user) #则写入session
print ("success") #成功
messages.add_message(request,messages.SUCCESS,'成功登录')
return HttpResponseRedirect('/index')
else:
messages.add_message(request,messages.WARNING,'账号尚未启用')
else:
messages.add_message(request,messages.WARNING,'账号或密码不正确')
else:
messages.add_message(request,messages.INFO,'请确认输入的信息是否正确')
else:
login_form=forms.LoginForm()
template=get_template('login.html')
request_context=RequestContext(request)
request_context.push(locals())
html=template.render(request_context)
return HttpResponse(html)
#注册
def zhuce(request):
if request.method=='POST':
form=forms.ZhuceForm(request.POST)
if form.is_valid():
name=request.POST['name']
email=request.POST['email']
pawd=request.POST['pawd']
try:
user=User.objects.create_user(name,email,pawd)
user.save()
messages.add_message(request,messages.SUCCESS,'注册成功')
return HttpResponseRedirect('/login')
except:
messages.add_message(request,messages.WARNING,'注册失败')
else:
messages.add_message(request,messages.WARNING,'请确认输入正确')
else:
form=forms.ZhuceForm()
template=get_template('zhuce.html')
request_context=RequestContext(request)
request_context.push(locals())
html=template.render(request_context)
return HttpResponse(html)
#注销
def logout(request):
auth.logout(request)
messages.add_message(request,messages.INFO,'注销成功')
return HttpResponseRedirect('/login')
2017-09-24`
ModelForm窗体之日历:
from django import forms
class DateInput(forms.DateInput): #日期类
input_type='date'
class PostForm(ModelForm):
class Meta:
model=models.Post
fields=['name','pawd',ddate']
widgets={
'ddate':DateInput(), #调用日期类
}
def __init__(self,*args,**kwargs):
super(UserForm,self).__init__(*args,**kwargs)
self.fields['name'].label='账 号'
self.fields['pawd'].label='密 码'
self.fields['ddate'].label='日 期'#可用鼠标单击输入日期
2017-10-18`
django数据库操作
from mysite.models import User,BookInfo
一.查询:
0.查询函数的返回值:
get:对象; all/filter/exclude/order_by:QuerySet; aggregate:字典; count:数字
1.判等:
User.objects.get(name='Apress') #查找指定name,有且只能有一个结果,否则抛出异常
User.objects.filter(name='Apress') #查找指定name的数据信息
2.模糊查询:
User.objects.filter(name__contains='press') #包含pross,相当于(select...where name like '%press%')
BookInfo.objects.filter(btitle__startswith='天') #查询以'天'开头的图书,(endswith结尾)
3.空查询:
BookInfo.objects.filter(btitle__isnull=False) #查询书名不为空的图书
4.范围查询:
BookInfo.objects.filter(id_in=[1,3,9]) #查询id为1,3或5的图书
5.比较查询:
BookInfo.objects.filter(id__gte=3) #查询id大于等于3的,gt/lt/lte(大于/小于/小于等于)
6.日期查询:
BookInfo.objects.filter(pub_date__year=1980) #查询1980年发表的图书
BookInfo.objects.filter(pub_date__gt=date(1980,1,1)) #查询1980年1月1日后发表的图书
7.排序查询:
User.objects.order_by('name') #根据名字排序
User.objects.order_by('-name') #根据名字逆向排序
User.objects.filter(country='U.S.A').order_by('-name') #过滤指定信息并进行反排序
User.objects.order_by('name')[0:2] #根据名字排序,并取出前两个(不支持-1)
8.排除查询:
BookInfo.objects.exclude(id=3) #查询id不为3的图书
9.F对象:
from django.db.models import F #使用前先导入
BookInfo.objects.filter(bread__gt=F('bcomment')) #查询阅读量大于评论量的图书
BookInfo.objects.filter(bread__gt=F('bcomment')*2) #查询阅读量大于2倍评论量的图书
10.Q对象:
from django.db.models import Q #使用前先导入
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30) #查id>3,或阅读量>30的,(|/&/^)或/与/非;
11.聚合函数:
from django.db.models import Sum,Count,Max,Min,Avg
BookInfo.objects.aggregate(Sum('bread')) #查询所有图书阅读量总和,值:{'bread__sum':180}
二.增加
user=User.objects.get(name='Apress')
user.name='Appress Publishing'
user.save() #更改名称并保存
三.修改:
User.objects.filter(id=23).update(name='Tom') #修改指定id的名称
User.objects.all().update(country='USA') #修改所有字段
四.删除:
User.objects.filter(id=23).delete() #删除id=23的
2017-11-14`
#上传文件一:
一.(views.py)
def upload_file(request):
if request.method == 'POST':
myfile = request.FILES.get('myfile', None)#获取上传文件
if myfile:
destination = open(os.path.join('C:\\PythonFiles\\upload\\upload1', myfile.name), 'wb')
for chunk in myfile.chunks(): #分块写入文件
destination.write(chunk)
destination.close()
fileName=myfile.name #文件名xx.jpg
size=myfile.size/1024 #大小KB
return render(request,'upload_success.html',locals())
else:
return HttpResponse('no files for upload')
else:
return render(request, 'upload.html')
二.(upload.html)
<form action="/upload/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile" />
<input type="submit" value="upload" />
</form>
三.(upload_success.html)
{% load staticfiles %}
<ul>
<li>文件名:{{ fileName }}</li>
<li>大小:{{ size }} KB</li>
<li>文件:<img src="{% static fileName %}" width="100" height="80"/></li>
</ul>
#上传文件二:
一.(models.py)
from django.db import models
class User(models.Model):
username=models.CharField(max_length=30) #文件名称
headImg=models.FileField(upload_to='./upload/') #不加upload则存到项目目录
def __unicode__(self):
return self.username
二.(views.py)
from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
from .models import User
class UserForm(forms.Form):
username=forms.CharField(label='姓名',max_length=30)
headImg=forms.FileField(label='文件')
def register(request):
if request.method=="POST":
uf=UserForm(request.POST,request.FILES)
if uf.is_valid():
username=uf.cleaned_data['username']
headImg=uf.cleaned_data['headImg']
user=User()
user.username=username
user.headImg=headImg
user.save()
return HttpResponse('upload ok')
else:
return HttpResponse('upload no')
else:
uf=UserForm()
return render_to_response('register.html',{'uf':uf})
三.(upload.html)
<form method="POST" enctype="multipart/form-data" >
{% csrf_token %}
{{ uf.as_p }}
<input type="submit" value="上传"/>
</form>
2017-11-17`
Django-Redis的使用
一.安装django-redis模块,已及redis服务器
二.(settings.py)配置:
CACHES={
'default':{
'BACKEND':'redis_cache.cache.RedisCache',
'LOCATION':'127.0.0.1:6379',
'OPTIONS':{'CLIENT_CLASS':'redis_cache.client.DefaultClient',},
},
}
NEVER_REDIS_TIMEOUT=365*24*60*60 #此条可以省略
三.在项目中创建一个(redis.py)的工具模块:
from django.conf import settings
from django.core.cache import cache
import json
#从缓存读数据
def read_from_cache(self,user_name):
key='user_id_of_'+user_name
value=cache.get(key)
if value==None:
data=None
else:
data=json.loads(value)
return data
#写数据到缓存
def write_to_cache(self,user_name):
key='user_id_of_'+user_name
cache.set(key,json.dumps(user_name),settings.NEVER_REDIS_TIMEOUT)
2017-11-18`
下载文件(以图片为例):
一.(views.py):
from django.http import StreamingHttpResponse
def down_file(request,file_name):
def file_iterator(name,chunk_size=512):
with open(name,'rb') as f:
while True:
c=f.read(chunk_size)
if c:
yield c
else:
break
the_file_name=os.path.join('C:\\PythonFiles\\upload\\upload1',file_name)
response=StreamingHttpResponse(file_iterator(the_file_name))
response['Content-Type']='application/octet-stream'
response['Content-Disposition']='attachment;filename="{0}"'.format(the_file_name)
return response
def down(request):
'''访问下载的网址,返回可下载的文件名列表'''
file_name=[n for n in os.listdir('C:\\PythonFiles\\upload\\upload1') if n.endswith('.jpg')]
return render(request,'down.html',{'file_name':file_name})
二.(urls.py):
url(r'^down/$',views.down),
url(r'^downs/(\w+\.jpg)/$',views.down_file),
三.(down.html):
{% for name in file_name %}
<a href="/downs/{{name}}">{{name}}</a>
{% endfor %}
2017-11-18`
#Django model,QuerySet序列化成json:
from django.core import serializers
from mysite.models import Users
一.QuerySet类型:
data=serializers.serialize('json',Users.objects.all())
ata1=serializers.serialize('json',Users.objects.filter(id=1))
二.Users实例类型:
#在Users类添加如下方法:
def toJSON(self):
import json
return json.dumps(dict([(attr,getattr(self,attr)) for attr in [f.name for f in self._meta.fields]]))
#要序列化时这样操作:
row=Users.objects.get(id=1)
row.toJSON()
2017-11-22`
django-admin:
python manage.py 常用命令:
runserver 8080 #更改服务器端口号
shell #启动交互页面
startapp app #创建一个app
syncdb #运行SQL语句,创建模型相应的Table
dbshell #启动数据库的命令行
sqlall app #查看这个app下的所有表
validate #验证模型是否配置有误
#django ModelAdmin举例:
class ArticleAdmin(admin.ModelAdmin):
list_display=('title','pub_date','update_time')
search_fields=('title','content') #按照标题或内容搜索
#list_filter=('status') #根据文章的状态筛选
2017-11-25`
#请求:
name=request.GET['name'] #GET请求,获得提交的name数据
name=request.GET.get('name')
name=request.POST['name'] #POST请求,获得提交的name数据
name=request.POST.get('name')
name=request.REQUEST.get('name') #获得(POST,GET)提交的name
# with在模板标签中赋值
{% with age=89 %}
年龄:{{ age | add:9}} #加9,输出值:98
{% endwith %}
2017-11-25`
一.模型类关系:
1)一对多: 图书类--英雄类
models.ForeignKey() #定义在多的类中
2)多对多: 新闻类--新闻类型类
models.ManyToManyField() #定义在哪个类中都可以
3)一对一: 员工基本信息类--员工详细信息类
models.OneToOneField() #定义在哪个类中都可以
二.关联查询(一对多)
1)通过对象执行关联查询:
#查询图书id为1的所有英雄信息
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
#查询英雄id为1的所属图书信息
h=HeroInfo.objects.get(id=1)
h.hbook
h.hbook_id
2)通过模型类实现关联查询:
#查询图书,要求图书中英雄的描述包含'八'
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
#查询图书,要求图书中的英雄id大于3
BookInfo.objects.filter(heroinfo__id__gt=3)
#查询英雄,要求书名为'天龙八部'
HeroInfo.objects.filter(hbook__btitle='天龙八部'
2017-12-07`
#在页面显示csv文件与pdf文件
import csv
from django.http import HttpResponse
def some_view(request): #CSV
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
return response
from reportlab.pdfgen import canvas
def some_view(request): #PDF
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
p = canvas.Canvas(response)
p.drawString(100, 100, "Hello world.")
p.showPage()
p.save()
return response
2017-12-09`
#在网页标题前显示图标:
<head>
<link rel="icon" href="picture.ico" type="image/x-icon"/>
</head>
2017-12-10`
Django部署到nginx
一、nginx.conf配置:
worker_processes 1;
events {
worker_connections 64;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root C:/djpy/yiran_house; #项目路径
index index.html index.htm;
charset utf-8;
location /media{
alias /cygdrive/C:/djpy/yiran_house/statics;
}
# 静态资源
location ~ .*.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
{
expires 30d;
break;
}
location / {
# 指定 fastcgi 的主机和端口
fastcgi_pass 127.0.0.1:8051;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
二、settings.py配置(可选):
DEBUG = False
ALLOWED_HOSTS = ["*"]
STATIC_ROOT='C:/djpy/yiran_house/statics'
三、启动:
(1)运行nginx.exe
(2)python manage.py runfcgi host=127.0.0.1 port=8051 protocol=fcgi method=threaded
2017-12-11`
Django部署到Apache
Windows10 + Apache2.4 + Django1.11 + Python3.6 项目部署:
一、安装Apache2.4
地址:http://www.apachelounge.com/download/
二、安装mod_wsgi
http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
安装好后,在命令行模式下执行:
mod_wsgi-express module-config
会输出一段字符串,把他复制到 Apache24/conf/httpd.conf
三、配置 Apache24/conf/httpd.conf
#添加mod_wsgi 模块,这是在命令行复制的
LoadFile "d:/programfiles/anaconda3/python36.dll"
LoadModule wsgi_module "d:/programfiles/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "d:/programfiles/anaconda3"
#指定静态资源路径
Alias /static/ C:/Users/Administrator/Desktop/djpy/Carry/static/
<Directory C:/Users/Administrator/Desktop/djpy/Carry/static>
Require all granted
</Directory>
#指定newsCollection项目的wsgi.py配置文件路径
WSGIScriptAlias / C:/Users/Administrator/Desktop/djpy/Carry/Carry/wsgi.py
#指定项目路径
WSGIPythonPath C:/Users/Administrator/Desktop/djpy/Carry
<Directory C:/Users/Administrator/Desktop/djpy/Carry/Carry>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
肆:Apache24\conf\extra\httpd-vhosts.conf配置:
#如果是80端口这句不用写,主配置文件httpd.conf已经有了
#Listen 8000
#这句貌似也不用,2.4的不需要这句
#NameVirtualHost *:80
#配置端口号,*可以换成主机ip,如果ip不固定,就有*就好了,很方便
<VirtualHost 192.168.2.204:8000>
#配置访问的域名
#ServerName huang
#配置主目录权限
<Directory />
Options FollowSymLinks
AllowOverride
Order allow,deny
Allow from all
</Directory>
Listen 192.168.2.204:8000
#配置项目配置文件目录权限,禁止访问
<Directory "C:/Users/Administrator/Desktop/djpy/Carry/Carry/">
Order Deny,Allow
Deny from all
</Directory>
#关键一句配置项目入口点
WSGIScriptAlias / "C:/Users/Administrator/Desktop/djpy/Carry/apache/django.wsgi"
#配置管理员静态文件目录,及其权限
Alias /static/admin C:/Python/Python36/Lib/site-packages/Django-1.11.8-py3.6.egg/django/contrib/admin/static/admin
<Directory "C:/Python/Python36/Lib/site-packages/Django-1.11.8-py3.6.egg/django/contrib/admin/static/admin/">
Order allow,deny
Allow from all
</Directory>
#配置静态文件目录,及其权限
Alias /static C:/Users/Administrator/Desktop/djpy/Carry/static
<Directory "C:/Users/Administrator/Desktop/djpy/Carry/static/">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
2018-05-28`
# Django 配置 celery
一、安装celery, django-celery, 并创建项目:
django-admin startproject test_celery
二、创建APP:python manage.py startapp app
三、在app下面创建 tasks.py 文件:
from __future__ import absolute_import
from celery import shared_task
import time
@shared_task(track_started=True)
def add():
time.sleep(5)
tm = time.time()
print(tm)
return tm
四、修改 settings.py 文件:
import djcelery
djcelery.setup_loader() #加载djcelery
BROKER_URL = 'redis://localhost:6379' #'pyamqp://guest@localhost//' #配置broker
BROKER_POOL_LIMIT = 0
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' #配置backend
CELERY_IMPORTS = ('app.tasks',)
INSTALLED_APPS = [
'djcelery', #django-celery必须添加
'test_celery',
]
五、在 test_celery/test_celery 下面创建 celery.py 文件:
from __future__ import absolute_import,unicode_literals #目的是拒绝隐士引入,celery.py和celery冲突。
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')
from django.conf import settings # noqa
app = Celery('test_celery')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
六,views.py 里面调用:
def index(request):
tm = add.delay()
for i in range(5):
if tm.ready():
break
time.sleep(1)
tm = tm.get() if tm.ready() else 0
print('views..........',tm,type(tm))
return HttpResponse('<h2>Index This is OK! %s</h2>'%tm)
七, 启动worker
celery worker -A test_celery -l info
注:重复出现 Worker-207' pid:13880 exited with 'exitcode 1 错误解决:
pip install --upgrade billiard