django - 1.9.8
python - 2.7
程序打头声明:
# -*- coding: utf-8 -*-
pycharm 设置中 file and code template 可以编辑新建文件的模板
py文件中 __date__='$DATE $TIME'可以自动生成当前时间
PEP8 的规范:
import python自带
import 第三方
import自己定义的
空两行
若app过多 存放在一个文件下 不用search forreference 和 open moved file in editor 然后mark source root
setting。py :import sys
sys.path.insert(0,os.path.join(BASE_DIR,'目录名'))
srtting。py中修改框架 语言
LANGUAGE_CODE
=
'zh-hans'
TIME_ZONE
=
'Asia/Shanghai'
USE_TZ
=
False数据存储时间设为本机
django目录
urls.py
网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。
views.py
处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。(功能实现)
models.py
与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。
templates 文件夹
views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。
admin.py
后台,可以用很少量的代码就拥有一个强大的后台。
settings.py
Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。
创建
static
文件夹 存放静态文件
django版本
Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3.
Django 1.6.x 支持 Python 2.6.X, 2.7.X, 3.2.X 和 3.3.X
Django 1.7.x 支持 Python 2.7, 3.2, 3.3, 和 3.4 (注意:Python 2.6 不支持了)
Django 1.8.x 支持 Python 2.7, 3.2, 3.3, 3.4 和 3.5. (长期支持版本 LTS)
Django 1.9.x 支持 Python 2.7, 3.4 和 3.5. 不支持 3.3 了
Django 1.10.x 支持 Python 2.7, 3.4 和 3.5.
Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(长期支持版本 LTS) 最后一个支持 Python 2.7 的版本
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (注意,不再支持 Python 2)
虚拟环境使用方法:
mkvirtualenv
zqxt:创建运行环境zqxt
workon
zqxt: 工作在 zqxt 环境 或 从其它环境切换到 zqxt 环境
deactivate
: 退出终端环境
数据库
pip install mysql-python 一般会报错推荐使用
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
下载源码安装
navicat中创建新的数据库字符集utf8 排序规则utf8 general。ci
setting。py中
DATABASES
=
{
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'webdb',
'USER':'root',
'PASSWORD':'1234',
'HOST':'127.0.0.1'
}
}
run maneger.py task 然后 makemigration创建默认数据表 migration生成数据表
run maneger.py task startapp 【app名】创建新的app
使用了image字段需要pip install pillow
model.py 中设计数据表例如
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default='')
image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png",max_length=100)
新建
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name=u"验证码")
email = models.EmailField(max_length=50, verbose_name=u"邮箱")
send_type = models.CharField(verbose_name=u"验证码类型", choices=(("register",u"注册"),("forget",u"找回密码"), ("update_email",u"修改邮箱")), max_length=30)
send_time = models.DateTimeField(verbose_name=u"发送时间", default=datetime.now)
class Meta:
verbose_name=u'邮箱验证码'
verbose_name_plural = verbose_name
继承
from
django.contrib.auth.models
import
AbstractUser 拥有大部分必须字段 还可以添加
class UserProfile(AbstractUser):#已覆盖默认user表
nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default='')
birthday = models.DateField(verbose_name=u"生日", null=True, blank=True)
gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female")
address = models.CharField(max_length=100, default=u"")
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png",max_length=100)
setting.py中注册新的app
循环引用 循环import会出错 解决方法:分层设计
若app过多 存放在一个文件下 不用search forreference 和 open moved file in editor
搭建后台开发管理系统
新建超级用户createsuperuser: python manage.py createsuperuser
pip install xadmin 会自动下载依赖包(crispy_forms)推荐使用github下载源码包方便修改源码则需自己下载crispy_forms
setting.py中注册app :xadmin 和 crispy_forms
urls.py中:
import
xadmin
urlpatterns
=
[
url(
r'^xadmin/'
,
xadmin.site.urls)
,
]
还需额外pip的包
future django-import-export six
之后重新
makemigration创建默认数据表
migration生成数据表
app下新建adminx.py文件
import xadmin
注册数据表 例如
class
EmailVerifyRecordAdmin
(
object
)
:
pass
xadmin
.site.register(EmailVerifyRecord
,
EmailVerifyRecordAdmin)
常用全局设置
from
xadmin
import
views
class GlobalSetting(object):
site_title=u'后台管理系统'
site_footer=u'YZH LAB'
menu_style='accordion'#合并app数据表
xadmin
.site.register(views.CommAdminView
,
GlobalSetting)
常用查找功能 写在adminx.py中
list_display
=
[
'code'
,
'email'
,
'send_type'
,
'send_type'
]
search_fields
=
[
'code'
,
'email'
,
'send_type'
]
#搜索框
list_filter
=
[
'code'
,
'email'
,
'send_type'
,
'send_type'
]
#过滤器
常用主题设置
class
BaseSetting
(
object
)
:
enable_themes
=
True
use_booswatch
=
True
修改app名:app.py文件中加入 verbose_name = u'中文名'
__init__.py中加入
default_app_config
=
'users.apps.UsersConfig'
url配置:
from
django.views.generic
import
TemplateView
url
(
r'^$'
,
TemplateView.as_view(
Template_name
=
'index.html'
)
,
name
=
'index'
)
,
//首页
url(
'^login/$'
,
LoginView.as_view()
,
name
=
"login"
)
,
前端全局配置:
静态文件加载全改为
{%
load
staticfiles
%}
href=
"
{%
static
'font-awesome-4.5.0/css/font-awesome.min.css'
%}
"
>
<
script
src=
"
{%
static
'js/jquery-1.11.3.min.js'
%}
"
>
script
>
有关url的改为
href=
"
{%
url
'login'
%}
"
>
static配置:
setting中
STATIC_URL
=
'/static/'
STATICFILES_DIRS
=
(
os.path.join(BASE_DIR,"static"),
)
因为是元组必须加逗号
html中的herf=“/login/”即可跳转
或
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
要写自己的后台逻辑需要添加自己的view
from users.views import login
url(r'^login/$',login,name='login'),
from
users.views
import
LogoutView
,
url(
'^login/$'
,
LoginView.as_view()
,
name
=
"login"
)
,
{%
csrf_token
%}
加在html表单之前 防止csrf攻击
from django.contrib.auth import authenticate#内置认证模块,认证密码与用户名正确才能登陆
form的action指向必须/xxx/ 单边/会报错
基于类方法做功能很重要
from django.views.generic.base import View
class LoginView(View):
创建forms.py 用于预处理用户提交的表单例如判断是否正确
from django import forms
class LoginForm(forms.Form):
html中的input。name必须与forms.py 的变量名称相同
password = forms.CharField(required=True,min_length=6)
限制最小长度可以减轻数据库负担
错误提示 html:
{%
if
login_form
.
errors
.
username
%}
errorput
{%
endif
%}>
<form action="/login/" method="post" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
<div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
<label>用 户 名label>
<input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
div>
<div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}">
条件用{% if xxx %} 变量用{{ xx }}
建议使用 不然前端跳转很混乱
view.py
:class
LoginView
(View)
:
from
users.views
import
LoginView
urls.py
:url
(
r'^login/$'
,
LoginView.as_view()
,
name
=
'login'
)
,
html
:<
a
class=
"index-font"
href=
"
{%
url
'index'
%}
"
>
回到首页
a
>
制作验证码(第三方插件) :
http://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation
github下载
mbi/
django
-simple-
captcha
pip install django-simple-captcha==0.4.6
注意版本
Add
captcha
to the
INSTALLED_APPS
in your
settings.py
Run
python manage.py migrate
Add an entry to your
urls.py
:
urlpatterns
+=
[
url
(r
'^captcha/'
,
include
(
'captcha.urls'
)),]
易错点:
return
render(request
,
'register.html'
,
{
'register_form'
:
register_form})
才可以在html中调用
register_form
的变量
用户注册流程:
1写一个注册的view:重写get 和post方法
class RegisterView(View):
def get(self,request):
register_form =RegisterForm()
return render(request,'register.html',{'register_form':register_form})
def post(self,request):
register_form = RegisterForm(request.POST)
if register_form.is_valid():
user_name = request.POST.get("email", "")
#防止注册相同用户名
if UserProfile.objects.filter(email=user_name):
return render(request, 'register.html', {'register_form': register_form,'msg':u'用户已存在'})
2实例数据库对象 对数据进行操作 例如保存密码和用户名
2.1对密码进行密文加密
from
django.contrib.auth.hashers
import
make_password
user_profile
.password
=
make_password(pass_word)
3邮箱发送激活链接
3.1因为要操作邮箱 再新建一个邮箱操作的app (utils) 在创建一个py文件建议命名email_send.py
3.2写一个发送函数
from
django.core.mail
import
send_mail
from
users.models
import
EmailVerifyRecord
from
yzhweb.settings
import
EMAIL_FROM
def send_register_email(email,send_type='register'):
email_record = EmailVerifyRecord()
code = generate_random_str(16)
email_record.code=code
email_record.email = email
email_record.send_type=send_type
email_record.save()
email_title=''
email_body=''
if send_type=='register':
email_title='yzhlab注册激活链接'
email_body='请点击下面的链接激活账号:http://127.0.0.1:8000/active/{0}'.format(code)
send_status=send_mail(email_title,email_body,EMAIL_FROM,[email])
3.3写一个生成激活码函数
from
random
import
Random
def generate_random_str(randomlength=8):
str=''
chars='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars)-1
random = Random()
for i in range(randomlength):
str=str+chars[random.randint(0,length)]
return str
3.4setting.py中配置发送邮箱的配置(进入邮箱客户端的客户端开启服务状态)
EMAIL_HOST = 'smtp.sina.com' #进入客户端查 一般是这种形式
EMAIL_PORT = 25 #默认
EMAIL_HOST_USER = '邮箱地址'
EMAIL_HOST_PASSWORD = '123456aa'
EMAIL_USER_TLS = False #默认
EMAIL_FROM = '邮箱地址'
3.5在view.py中调用utils的发送函数
3.6处理用户激活的url
url
(
r'^active/(?P.*)/$'
,
ActiveUserView.as_view()
,
name
=
'user_active'
)
class ActiveUserView(View):
def get(self,request,active_code):
all_records = EmailVerifyRecord.objects.filter(code=active_code)
if all_records:
for record in all_records:
email = record.email
user = UserProfile.objects.get(email=email)
user.is_active = True
user.save()
else:
return render(request, 'active_fail.html')#验证失败的返回
3.7新建一个提示连接失效的html,保证用户体验
4忘记密码
4.1 配置一个找回密码的url
url(
r'^forgetpwd/$'
,
ForgetpwdView.as_view()
,
name
=
'forget_pwd'
)
,
4.2写一个忘记密码的view:重写get 和post方法
class ForgetpwdView(View):
def get(self,request):
forgetpwd_form = ForgetpwdForm()
return render(request,'forgetpwd.html',{'forgetpwd_form':forgetpwd_form})
def post(self,request):
forgetpwd_form = ForgetpwdForm(request.POST)
4.3创建忘记密码的form在form.py 参考注册的form,几乎一样
4.4完善post的逻辑
def post(self,request):
forgetpwd_form = ForgetpwdForm(request.POST)
if forgetpwd_form.is_valid():
email = request.POST.get('email','')
send_register_email(email, 'forget')
return render(request, 'send_success.html')
else:
return render(request, 'forgetpwd.html', {'forgetpwd_form': forgetpwd_form})
4.5添加忘记密码的邮箱发送内容
elif send_type == 'forget':
email_title = 'yzhlab密码重置链接'
email_body = '请点击下面的链接重置你的密码:http://127.0.0.1:8000/reset/{0}'.format(code)
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
4.6重设密码
class ResetView(View):
def get(self,request,active_code):
all_records = EmailVerifyRecord.objects.filter(code=active_code)
if all_records:
for record in all_records:
email = record.email
return render(request, 'password_reset.html',{'email':email})
else:
return render(request, 'active_fail.html')
return render(request,'login.html')
4.7添加对应的 form.py内容 和url配置
5注销(django内置注销功能)
from
django.contrib.auth
import
logout
class LogoutView(View):
def get(self,request):
logout(request)
return HttpResponseRedirect(reverse('index'))
这基本完成登录-注册-忘记密码-修改密码模块