pip3 freeze > requirements.txt 導出相關依賴 配置永久源 cd ~ mkdir .pip cd .pip cat pip.conf [global] timeout = 6000 index-url = http://pypi.douban.com/simple trusted-host = pypi.douban.com pip3.7 install -r requirements.txt --user --------------------------------------------- deepin操作 mkdir -p /home/wyl/.pip/; cat pip.conf [global] timeout = 6000 index-url = http://pypi.douban.com/simple trusted-host = pypi.douban.com /usr/local/python3/bin/pip3.7 install -r requirements.txt --user -------------------------------------------- 檢查: /usr/local/python3/bin/python3.7 -m pip list /usr/local/python3/bin/python3.7–m pip –-version查看當前Python對應的pip版本; /usr/local/python3/bin/python3.7 –m pip list查看當前Python對應的pip安裝的第三方庫; /usr/local/python3/bin/python3.7 –m pip install 庫名 即可安裝對應的擴展庫; /usr/local/python3/bin/python3.7 –m pip uninstall 庫名 即可卸載對應的擴展庫; #單獨安裝 /usr/local/python3/bin/pip3 install django==2.1.8 -i https://pypi.tuna.tsinghua.edu.cn/simple --user windwos下安裝: 永久更改鏡像源 在 “C:\Users\用戶名” 文件夾下,添加pip文件夾,文件夾內新建pip.ini文件,內容爲: [global] https://pypi.tuna.tsinghua.edu.cn/simple pip3 install -r requirements.txt
cmd-進入目錄運行一下命令創建Django項目 django-admin startproject Blog_wyl
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
mkdir templates mkdir static
在最後面加入: STATIC_PATH = os.path.join(BASE_DIR,'static') STATICFILES_DIRS = (STATIC_PATH,) #添加用戶資源存文件夾 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 在第57行修改 TEMPLATES = [ {'DIRS':[os.path.join(BASE_DIR,'templates')]} ]
python manage.py startapp Blog_app
在33行加入 INSTALLED_APPS = ('Blog_app',)
#對於django2.2版本可能出現的問題解決方案:https://my.oschina.net/wangyunlong/blog/3075265 1.安裝pymysql模塊 pip isntall pymysql 2.在setting中註釋掉默認的數據庫.添加mysql配置 import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'Blog_app', 'HOST': '47.104.124.214', 'USER': 'root', 'PASSWORD': 'django', 'PORT': '3306', } } 3.到mysql數據庫創建相關庫,切記編碼設置Blog_app爲utf-8 create database Blog_app
切記手動創建數據庫且設置數據編碼爲utf8 python manage.py makemigrations #生產差異數據文件 python manage.py migrate #生產數據表 python manage.py createsuperuser #創建管理員root
1.安裝pip install django-redis 2.配置setting文件 vi setting.py # 配置session使用redis CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://47.104.124.214:6379', # 指明使用redis的1號數據庫後面加/庫名即可 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PASSWORD": "", }, }, } # session的存儲配置 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' # 設置session失效時間,單位爲秒 SESSION_COOKIE_AGE = 60*5 #redis簡單命令:redis-cli -h 47.104.124.214 -p 6379 #keys *
路由資料:https://www.cnblogs.com/zzzlw/p/9739789.html 導入include,re_path from django.urls import path,include,re_path 導入app的視圖 from Registration import view 導入settings from django.conf import settings 路由別名: path('',views.index, name='index'), 多級路由: path('Registration/',include('Registration.urls')), 動態路由: path('articles/<int:id>', show_article) #類似訪問:articles/1 視圖頁面: show_article(request, id=id) path('list-<int:lid>.html', views.list, name='list'),#列表頁 類似訪問: list-3.html path('show-<int:sid>.html', views.show, name='show'),#內容頁 path('tag/<tag>', views.tag, name='tags'),#標籤列表頁類似訪問 :tag/zabbix 此時:模板頁面應都基於首頁路由進行配置如: {% url 'index' %}show-{{ L.id }}.html #如果有多個app時,該如何使用: django-admin startproject django_test django-admin startapp app1 django-admin startapp app2 第一種:每一個app都有單獨的urls.py 總:urls.py ################################## from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('app1/', include('app1.urls')), path('app2/', include('app2.urls')), ] ############################# app1/urls.py與app2/urls.py ############################## from django.urls import path from . import views urlpatterns = [ path('index', views.index), ] ############################### 第二種:多個app用同一個urls.py from django.contrib import admin from django.urls import path from app1 import views as app1_views #別名 from app2 import views as app2_views #別名 urlpatterns = [ path('admin/', admin.site.urls), path('app1/', app1_views.index), path('app2/', app2_views.index), ] ###############最後views.py################ from django.shortcuts import render from django.shortcuts import HttpResponse def index(request): return HttpResponse('hello app1')
1.如果有一個方法是全局公用的,比如所有頁面都還有相同的數據則可以將其方法直接加入setting文件如:views.py中有如下內容:global_variable 他爲一個全局函數。這種適合單個app全局變量,不過寫的方式很多。都可以實現。 def global_variable(request): allcategory = Category.objects.all() remen = Article.objects.filter(tui__id=2)[:6] tags = Tag.objects.all() return locals() views操作數據庫: #django的操作數據庫get方法是從數據庫的取得一個匹配的結果,返回一個對象,如果記錄不存在的話,它會報錯。 #django的操作數據庫filter方法是從數據庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。 #get 參數必須是model定義的字段,且查出來的記錄只有一條,多餘一條報錯 #fitler類似於模糊匹配,如mysql中的where ,like ,in all_remen_tui = models.Article.objects.filter(tui__id=2)[:6] allbanner = models.Banner.objects.filter(is_active=True)[0:4] cname = models.Category.objects.get(id=lid) #獲取當前文章的欄目名 #對數據進行倒序排列 allarticle = models.Article.objects.all().order_by('-id')[0:6] #order_by正對id自動進行倒序排序 hot = models.Article.objects.all().order_by('views')[:10] #針對views進行排序通過瀏覽數進行排序 此時可以在setting中將其註冊添加到TEMPLATES中 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'Blog_app.views.global_variable', ], }, }, ] 全局變量返回第二種寫法: 這種適合所有app共有的去全局變量 https://www.cnblogs.com/ccorz/p/django-zhong-desetting-quan-ju-bian-liang-de-dao-r.html 比如在setting文件中 配置:WHOSE = '誰的' 在views.py中導入settings配置如下: from django.conf import settings def mainHandle(request): content={ 'WHOSE':settings.WHOSE } return render(request, 'main.html',content) 然後在main.html中配置: <a class="logo" href="#"> {{WHOSE}}工具 </a> 即可 return 返回內容建議使用:conent精確返回 def index(request): Persons = models.Person.objects.all() content = { 'persons':Persons } return render(request,'index.html',content) redirect 跳轉 def index(request): # 業務邏輯代碼 return redirect("https://blog.csdn.net/miaoqinian") HttpResponse 返回一個字符串 def index(request): # 業務邏輯代碼 return HttpResponse("OK") render返回一個字典 def index(request): content={ 'name':'wangyunlong-app2', 'url':settings.web_url, } #return HttpResponse('hello app2') return render(request,'app2/index.html',content)
[12.1]:選擇性-[有具體範圍,具有不可變性]
1.如果某一個字段值具有多種選擇性,且選擇性具有確定不可變性質,比如:性別男/女兩種範圍固定不可能在多出個不男不女,比如狀態:上線/下線。
可用如下例1:
class User(models.Model):
gender = (('male','男'),('female','女'))
sex = models.CharField(verbose_name=u'性別',max_length=32,choices=gender,default="男")
例2:
class server(models.Model):
server_status_choice=((0,'下線'),(1,'上線'),)
name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
status = models.SmallIntegerField(choices=server_status_choice, default=0, verbose_name='設備狀態')
[12.2]選擇性-[無具體範圍,具有可變性]
利用數據庫關係模型如:通過一對多模型實現。
[12.3]一對一模型:
#一對一模型: 一個人對應一個唯一的身份證號,不可重複。
例如:用戶確認碼,一個用戶對於一個確認碼
class User(models.Model):
user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True)
gender = (('male','男'),('female','女'))
sex = models.CharField(verbose_name=u'性別',max_length=32,choices=gender,default="男")
class ConfirmString(models.Model):
code = models.CharField(max_length=256)
user = models.OneToOneField('User',on_delete=models.CASCADE)
c_time = models.DateTimeField(auto_now_add=True)
[12.4]一對多模型
一對多|多對一:一個服務器對應一個機房,一個機房可能對應多個服務器
資料:https://www.cnblogs.com/pyspark/p/8638180.html
idc = models.ForeignKey(idc,related_name='idc_server',on_delete=models.CASCADE,verbose_name=u'idc',default="")
#注:#on_delete=models.CASCADE主外關係鍵中,級聯刪除,也就是當刪除主表的數據時候從表中的數據也隨着一起刪除
註釋:related_name作用:
舉例:創建一個作者表和一個書籍表,一個作者可以寫多本書,一個書只能有一個作者。
class Person(models.Model);
name = models.CharField(verbose_name='作者姓名', max_length=10)
class Book(models.Model):
person = models.ForeignKey(Person, related_name='person_book')
title = models.CharField(verbose_name='書籍名稱', max_length=10)
查詢這個人寫了多少本書:
person = Person.objects.fiter(name='wyl')
person.person_books.all()
[12.5]多對多模型:
一個服務器可以安裝多個應用,一個應用可以在多個服務器上安裝
class app(models.Model):
name = models.CharField(max_length=100,verbose_name=u'應用名稱',default="")
class Meta:
db_table = 'app'
verbose_name = "應用[app]"
verbose_name_plural = "應用[app]"
def __str__(self):
return self.name
class server(models.Model):
name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
app_name = models.ManyToManyField(app,blank=True,verbose_name=u'應用名稱',)
例如博客中的標籤:
tags = models.ManyToManyField(Tag,verbose_name='標籤', blank=True)#多對多關係模型
[12.6] 總結字段
時間:
created_time = models.DateTimeField('發佈時間', auto_now_add=True)
modified_time = models.DateTimeField('修改時間', auto_now=True)
url連接:
link_url = models.URLField('圖片鏈接', max_length=100)
圖片:
img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章圖片', blank=True, null=True)
img = models.ImageField('輪播圖', upload_to='banner_img/')
#數據庫中直接存圖片需要安裝:pip3 install Pillow 模塊
字符串
user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True)
passwd = models.CharField(verbose_name=u'密碼',max_length=128)
郵箱:
email = models.EmailField(verbose_name=u'郵箱',unique=True)
布爾類型:
confiremd = models.BooleanField(default=False)
文本:
excerpt = models.TextField(verbose_name=u'摘要',max_length=200,blank=True)#文本類型
長整型:
index = models.IntegerField(default=9999,verbose_name=u'分類排序')#整數形式
正整數:
views = models.PositiveIntegerField('閱讀量', default=0)
IP地址:
ip = models.GenericIPAddressField(verbose_name=u'ip地址',default="")
浮點數:
文件上傳:
# media/%Y%m%d/爲圖片的真實放置路徑,因爲settings中已經配置了MEDIA_ROOT爲media文件夾,blank=True允許表單的該字段對應值爲空,意思是非必填字段
avatar = models.ImageField(upload_to='%Y%m%d/', blank=True)
# 文件將會上傳到 MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
# 文件將會保存到 MEDIA_ROOT/uploads/2015/01/30
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
完整實例
例子: 包含了大多數數據類型,可供參考
##################################################################
from django.db import models
#服務器存放地:阿里雲,華爲雲,騰訊雲,地區機房,企業機房
class idc(models.Model):
name = models.CharField(max_length=100,verbose_name=u'地區名稱',default="")
class Meta:
db_table = 'idc'
verbose_name = "地區[idc]"
verbose_name_plural = "地區[idc]"
def __str__(self):
return self.name
#應用程序:nginx,tomcat,mysql,mognodb等
class app(models.Model):
name = models.CharField(max_length=100,verbose_name=u'應用名稱',default="")
class Meta:
db_table = 'app'
verbose_name = "應用[app]"
verbose_name_plural = "應用[app]"
def __str__(self):
return self.name
#服務器:
class server(models.Model):
server_status_choice=((0,'正常'),(1,'異常'),)
name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
#服務器縮略圖
img = models.ImageField(upload_to='article_img/%Y%m%d/', verbose_name='縮略圖', blank=True, null=True)
#一對多模型模型實現idc
idc = models.ForeignKey(idc,related_name='idc_server',on_delete=models.CASCADE,verbose_name=u'idc',default="")
#小整數[-32768,32768]
status = models.SmallIntegerField(choices=server_status_choice, default=0, verbose_name='服務狀態')
#ip格式
ip = models.GenericIPAddressField(verbose_name=u'ip地址',default="")
#字符串格式
domain = models.CharField(max_length=100,verbose_name=u'域名',default="")
#常整型格式
cpu = models.IntegerField(default=9999,verbose_name=u'cpu',)
disk = models.IntegerField(default=9999,verbose_name=u'磁盤',)
mem = models.IntegerField(default=9999,verbose_name=u'內存',)
network = models.FloatField(verbose_name=u'帶寬',default=0)
#浮點數,network不應該是浮點數,這裏只是爲了測試而已
ssh = models.CharField(max_length=100,verbose_name=u'sh地址',default=""),
#正整數[0-2147483647]
port = models.PositiveIntegerField(verbose_name=u'ssh端口',default="0")
#多對多模型實現應用名稱
app_name = models.ManyToManyField(app,blank=True,verbose_name=u'應用名稱',)
#上面的時間是不會再admin後臺顯示的
created_time = models.DateTimeField('發佈時間', auto_now_add=True)
modified_time = models.DateTimeField('修改時間', auto_now=True)
#如果不想自動填寫,可不寫auto_now=True默認False
created_times = models.DateField(verbose_name=u'購買時間',)
DeadlineDate = models.DateTimeField(verbose_name=u'截止日期',)
#上下線狀態這裏採用Boolean方式
statuss = models.BooleanField(verbose_name=u'上線',default=False)
#告警郵箱
email = models.EmailField(verbose_name=u'告警郵箱',default='[email protected]') #郵箱
#文本格式實現備註
remarks = models.TextField(verbose_name=u'備註',default="")
def __str__(self):
return self.name
class Meta:
db_table = 'server' #設置數據表名
unique_together = (("name","ip","domain","email"),) #設置哪些字段不可有重複數據
verbose_name = "主機[server]" #admin頁面顯示
verbose_name_plural = "主機[server]"
##################################################################
舉例:參考https://blog.csdn.net/weixin_37773766/article/details/80330221
class test(models.Model):
userName = models.CharField(max_length=30) #用戶名
passWord = models.CharField(max_length=30) #密碼
gendle = models.BooleanField() #性別
birthday = models.DateField() #出生日期
weigth = models.FloatField() #體重
heigth = models.IntegerField() #身高
email = models.EmailField() #郵箱
host = models.GenericIPAddressField() #IP地址
introduce = models.TextField() #個人簡介
blog = models.URLField() #博客地址
photo = models.ImageField() #照片
#CV = models.FilePathField() #個人簡歷文件
createDate = models.DateTimeField() #帳號申請時間
def __str__(self):
return self.userName
class Meta:
db_table = 'test'
verbose_name = "測試[test]"
verbose_name_plural = "測試[test]"
#####################################################
說明:
class Meta:
ordering = ['datetime'] #排序方式
unique_together = (("url","email"),)
#verbose_name = '測試表' #單數
verbose_name_plural = '測試表'#複數
#db_table = 'Test Table' #設置當前表在創建時候的名字
#app_label = '' 指明當前的模型類屬於哪個app
#每一個表的實例是一條數據
def __str__(self):
return str(self.datetime)
admin頁面顯示簡單設置
from django.contrib import admin
from blog.models import idc,server,app
#設置admin列表頁面
from django.contrib import admin
from blog.models import idc,server,app
#設置admin列表頁面
#serverAdmin 由 server表+ Admin組成 ,list_display中的字段指定需要顯示的字段
class serverAdmin(admin.ModelAdmin):
list_display = ['name','idc','domain']
admin.site.register(server,serverAdmin) #重要的是導入serverAdmin及server
admin.site.register([idc,app])