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加載解析就可以