Django1.9.8 + Xadmin + Windows 快速搭建網站


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存在服務器端一段時間失效

16.驗證碼 使用captcha github 文檔

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM