1.创建python虚拟环境
pip install virtualenvwrapper-win
mkvirtualenv env3.4
workon env3.4
deactivate
pip install virtualenv
virtualenv -p c:\Python27\python.exe env2.7
cd env2.7\Scripts\activate
deactivate
2.安装django
pip install django==1.9.8
3.安装mysql python 驱动
http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
4.配置setting中的DATABASES
填写链接数据库的
用户名
密码
host
数据库名
1 DATABASES = { 2 'default': { 3 #'ENGINE': 'django.db.backends.sqlite3', 4 'ENGINE': 'django.db.backends.mysql', 5 #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 6 'NAME': 'learndjango', 7 'USER': 'root', 8 'PASSWORD':'', 9 'HOST':'127.0.0.1', 10 'OPTIONS' : { "init_command":"SET foreign_key_checks = 0;", }, 11 12 } 13 14 }
5.生成django默认的数据表
pycharm中tools run manager.py task
makmigrations
migrate
6. 新建app(一般都是新建user app)
tools run manager.py task
1.startapp appName(users)
接下来编辑 models.py 设计对象属性(对象属性设计过程中不要将名字写成与其他的对象名称重名如果在该对象作为另一个有重名的对象的外键的时候就会出现
fields.E303: Reverse query name for field <field name>
clashes with field <field name>错误 如果出现该错误则可以添加related_name='append_XXX' 属性
)
user
继承原有的AbstractUser 并添加 昵称 生日 性别 地址 手机号码 头像
对于头像使用到imageFiled属性 依赖python 的pillow包
pip install pillow
前面步骤都创建完成后使用
tools run manager.py task
1.makemigrations apps
2.migrate
点击运行django项目
会提示是否删除 auth|user 表 选yes
tools run manager.py task
2.startapp appName(courses)
在django中表关系使用models.ForeignKey 来建立
model.py 设计对象属性
courses(课程表)
1-n(一对多)课程章节lesson(章节表)
1-n(一对多)课程小章节(video表)
lessonRecourse课程资源表
3.startapp appName(organization)
model.py 设计对象属性
courseOrg(机构基本信息表)
teacher(教师基本信息)
city(城市信息)
4.startapp appName(operation)
model.py 设计对象属性
userAsk(用户咨询表)
userCourseComment(用户课程评论表)
userFav(用户收藏表)
userMessage(用户提示信息表)
userCourse(用户学习课程表)
代码示例
1 class userProfile(AbstractUser): 2 nickName = models.CharField(max_length= 50, verbose_name=u"昵称", default="") 3 birthday = models.DateField(verbose_name=u"生日", null= True, blank=True) 4 gender = models.CharField(choices=(("male",u"男"),("female",u"女")), default="female", max_length= 6, verbose_name=u"性别") 5 address = models.CharField(max_length= 100, default=u"") 6 mobile = models.CharField(max_length= 11, null=True, blank=True) 7 image = models.ImageField(upload_to="image/%Y/%m", default=u"image/default.png", max_length= 100) 8 9 class Meta: 10 verbose_name = u"用户信息" 11 verbose_name_plural = verbose_name 12 13 def __unicode__(self): 14 return self.username
7. 在setting 中的 INSTALL_APPS 中对创建的app进行注册
8.将model注册到xadmin中 快速搭建后台管理系统
from .models import 对象(user)
import xadmin
“注册”
class 对象(user)Admin(object):
list_display = ['属性列表用于在xadmin展示',]
list_filter = ['属性列表用于在xadmin中进行过滤',]
search_fields = ['属性列表用于在xadmin中进行搜索',]
“关联”
xadmin.site.register(user,userAdmin)
9.进行全局的替换工作logo footer.....
app 下面的apps用来修改菜单显示内容 verbose_name = u"XXXXX"
在 init 文件中是配置生效 default_app_config = "XXX.apps.XXXConfig"
10.配置站点可以直接访问的index页面 ip:端口号 就可以直接访问 192.168.0.108::8000 直接到index
1 from django.views.generic import TemplateView 2 #直接跳转到index页面 3 urlpatterns = [ 4 url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"), 5 ]
11.使用静态文件夹在setting中添加代码段
1 STATICFILES_DIRS = [ 2 os.path.join(BASE_DIR , 'static') 3 ]
12.禁止访问403错误 CSRF验证失败 django的安全机制 需要在templates 的form 表单里面添加 {% csrf_token%}
添加csrf_token 之后就会添加一个隐藏的input标签 将生成的csrf验证码添加进去
1 <input type="hidden" name="csrfmiddlewaretoken" value="5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy">
1 <form ......> 2 {% csrf_token%} 3 </form>
13.添加邮箱验证
1.重写authenticate 方法
1 from django.contrib.auth.backends import ModelBackend 2 from django.db.models import Q 3 #apps/users 4 #继承ModelBackends 类 将authenticate 方法重写 5 #Q 支持(Q(username = username)|Q(email= username),XXX)的方式 6 class customBackend(ModelBackend): 7 def authenticate(self, username=None, password=None, **kwargs): 8 try: 9 user = userProfile.objects.get(Q(username = username)|Q(email= username)) 10 if user.check_password(password): 11 return user 12 except Exception as e: 13 return None
2.在setting文件中添加这一配置(便可以支持邮箱登录)
AUTHENTICATION_BACKENDS = ( 'users.views.customBackend', )
3.在urls.py中url映射进行修改
1 from users.views import loginView 2 url(r'^login/$', loginView.as_view(), name="login"),
14.后台使用django的forms进行字段验证
1.在user app中添加一个forms.py 添加要验证的字段
1 from django import forms 2 3 class loginForm(forms.Form): 4 #此处字段名称必须与html中的字段一样才可以进行校验 5 username = forms.CharField(required=True) 6 password = forms.CharField(required=True, min_length=5)
2.在views.py中使用forms
1 def post(self, request): 2 #将表单里面的字段对应到loginForm的字段 去做校验(无论前端有没有校验后端都必须校验) 3 loginForms = loginForm(request.POST) 4 if loginForms.is_valid(): 5 userName = request.POST.get("username", "") 6 password = request.POST.get("password", "") 7 user = authenticate(username=userName, password=password) 8 if user is not None: 9 login(request, user) 10 return render(request, 'index.html', {}) 11 else: 12 return render(request, 'login.html', {"msg": "用户名或密码错误!"}) 13 else: 14 return render(request, 'login.html', {"loginForms":loginForms})
3.在templates中回传错误信息
1 #循环遍历并显示loginForms中的所有错误 2 <div class="error btns login-form-tips" id="jsLoginTips">{% for key, error in loginForms.errors.items%}{{ key }}:{{ error }}{% endfor %}{{ msg }}</div> 3 #仅显示用户名或者密码字段错误 4 <div class="form-group marb20 {% for key, error in loginForms.errors.username %}{{ error }}errorput{% endfor %}"> 5 <div class="form-group marb8 {% for key, error in loginForms.errors.password %}{{ error }}errorput{% endfor %}">
15.django实现登录的详细过程
http是一种无状态的协议 为了解决这一件事情添加cookie 是一种浏览器本地保存一种状态保存服务器返回的信息 存在各服务器域名之下 不可以跨域访问
但是cookie本身不安全 因此服务器端生成一个session存在服务器端一段时间失效
1.安装captcha pip install django-simple-captcha==0.4.6
2.在setting中installed app 添加captcha
3.urls中添加 url(r'^captcha/', include('captcha.urls')),
4.pycharm tools run manager.py task migration 最后执行migrate(完成图片验证码的基本配置)
5.具体使用步骤
1.在apps中的应用users中的forms.py 添加表单验证
1 from captcha.fields import CaptchaField 2 3 class registerForm(forms.Form): 4 email = forms.EmailField(required=True) 5 password = forms.CharField(required=True, min_length=5) 6 captcha = CaptchaField()
2.views中的register类
1 class registerView(View): 2 def get(self, request): 3 registerForms = registerForm() 4 return render(request, 'register.html', {"registerForms":registerForms})
2.在html页面中使用
1 {{ registerForms.captcha }}
17.注册 激活 修改密码
1.将所有的app放到新建的apps文件夹下面
需要在setting中添加apps到路径里边 sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
3.定义AUTH_USER_MODEL = 'users.userProfile' 去覆盖原有的基础user表
4.#USE_TZ = True #True使用UTC时间 False 使用本地时间
5. app 下的admin.py 用来注册后台管理系统
class userProfileAdmin(admin.ModelAdmin):
"注册"
pass
"关联"
admin.site.register(userProfile, userProfileAdmin)
makemigrations app 生成一个比对记录
#No changes detected in app 'messages' 要在setting 中的apps 进行注册
migrate 生成数据表
model 设计(ORM):
url name = 'XDXXX' 在页面上的action={%url 'XDXXX'%}
django apps设计
django apps model 设计
django apps model 数据表生成与修改
user 用户管理
course 课程管理
organization 机构和讲师管理
operation 用户操作管理(用来解决循环引用的问题)
使用xadmin遇到的一些错误
No module named future.utils pip install future
No module named import_export.admin pip install django-import-export
取消外键检查
1 DATABASES = { 2 'default': { 3 #'ENGINE': 'django.db.backends.sqlite3', 4 'ENGINE': 'django.db.backends.mysql', 5 #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 6 'NAME': 'learndjango', 7 'USER': 'root', 8 'PASSWORD':'', 9 'HOST':'127.0.0.1', 10 'OPTIONS' : { "init_command":"SET foreign_key_checks = 0;", }, 11 12 } 13 14 }
pycharm 添加git
django 使用xadmin pip install xadmin 依赖自己安装好 在installapp 里面注册 修改urls 为xadmin
slice
#使用模板中的slice过滤相对地址中的路径是哪一个然后给标签添加class {% if request.path|slice:'7' == '/course' %}class = "active"{% endif %}
Q
from django.db.models import Q #使用Q对多个条件进行过滤 allCourses = allCourses.filter(Q(name__icontains=keywords)|Q(desc__icontains=keywords))
default_if_none
#template default_if_none 如果查到的该值为空就显示后面设置的值 {{ request.user.address|default_if_none:'' }}
#sql 注入 通过输入sql语法进行操作
#xss 攻击 盗取账号 资料
#csrf 攻击 跨站请求伪造
window安装uwsgi 遇到AttributeError: 'module' object has no attribute 'uname' 在uwsgi下载压缩包解压到Python的Python27\Lib\site-packages 找到 uwsgiconfig.py 添加import platform 并且将 os.uname 替换为 platform.uname
Django 使用 django-rest-framework 写一个API 接口返回Json文件
安装 pip install djangorestframework
安装 pip install django-rest-swagger
安装pip install django-simple-serializer
修改settings.py 文件
添加app
'rest_framework_swagger',
'rest_framework',
view.py
from django.shortcuts import render from rest_framework.views import APIView from dss.Serializer import serializer from django.http import HttpResponse, HttpRequest import json # Create your views here. def response_as_json(data, foreign_penetrate=False): jsonString = serializer(data=data, output_type="json", foreign=foreign_penetrate) response = HttpResponse( # json.dumps(dataa, cls=MyEncoder), jsonString, content_type="application/json", ) response["Access-Control-Allow-Origin"] = "*" return response def return_json(abstract): result = dict() result['x'] = 'a' result['y'] = 'b' result['z'] = 'c' return result def json_response(data, code=200, foreign_penetrate=False, **kwargs): data = { "code": code, "msg": "成功", "data": data, } return response_as_json(data, foreign_penetrate=foreign_penetrate) def json_error(error_string="", code=500, **kwargs): data = { "code": code, "msg": error_string, "data": {} } data.update(kwargs) return response_as_json(data) JsonResponse = json_response JsonError = json_error class ReturnJson(APIView): def get(self, request, *args, **kwargs): xx = request.query_params abstract = xx['xx'] abstract = json.dumps(return_json(abstract)) return JsonResponse(abstract)
通过localhost:8000/api/genjson?abstract=内容 就可以得到返回的字典文件 使用json的loads加载解析就可以