菜鸟教程(runoob.com)
Django 資源 與 知識 Django中自建腳本并使用Django環境 model中的save()方法說明 filter()用法
2018/11/06 Chenxin
資料說明
Django基礎入門 http://www.liujiangblog.com/blog/36/ 版本2.1.3
Django晉級教程 http://www.liujiangblog.com/course/django/2 版本1.11.6 其中的"綜合篇"里有不少是實際項目會碰到的問題.實戰里有個開源的CMDB.
Django官方教程 https://docs.djangoproject.com/zh-hans/2.1/ 已經出了中文版(但還有很多地方沒有翻譯好) 版本:最新
HTML語法
https://www.cnblogs.com/wanglisong/p/6924886.html
http://www.w3school.com.cn/html/html_jianjie.asp
Django基礎指令
創建Django項目,然后創建應用
python manage.py startapp polls
寫好對應的模型,admin.py,視圖,然后生成DB
python manage.py makemigrations
python manage.py migrate
創建Django的admin賬戶
python manage.py createsuperuser
Django模板語法
2018/12/04
參考
http://www.runoob.com/django/django-template.html
說明
模板不是html語法的概念,是Django專有的概念.
html本身不支持繼承,但Django的模板有繼承的概念.
模板對外鍵的使用,過濾,請參考運維portal系統中的相關代碼"monitor.html".
Django 模板標簽
if/else 標簽
基本語法格式如下:
{% if condition %}
... display
{% endif %}
或者:
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
根據條件判斷是否輸出。if/else 支持嵌套。
{% if %} 標簽接受 and , or 或者 not 關鍵字來對多個變量做判斷 ,或者對變量取反( not ),例如:
{% if athlete_list and coach_list %}
athletes 和 coaches 變量都是可用的。
{% endif %}
for 標簽
{% for %} 允許我們在一個序列上迭代。
循環語法是 for X in Y 。
每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。
例如,給定一個運動員列表 athlete_list 變量,我們可以使用下面的代碼來顯示這個列表:
{% for athlete in athlete_list %}
{{ athlete.name }}
{% endfor %}
給標簽增加一個 reversed 使得該列表被反向迭代:
{% for athlete in athlete_list reversed %}
...
{% endfor %}
可以嵌套使用 {% for %} 標簽:
{% for athlete in athlete_list %}
{{ athlete.name }}
{% for sport in athlete.sports_played %}
{{ sport }}
{% endfor %}
{% endfor %}
ifequal/ifnotequal 標簽
{% ifequal %} 標簽比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比較兩個模板變量 user 和 currentuser :
{% ifequal user currentuser %}
Welcome!
{% endifequal %}
和 {% if %} 類似, {% ifequal %} 支持可選的 {% else%} 標簽:
{% ifequal section 'sitenews' %}
Site News
{% else %}
No News Here
{% endifequal %}
注釋標簽
Django 注釋使用 {# #}。
{# 這是一個注釋 #}
過濾器
模板過濾器可以在變量被顯示前修改它,過濾器使用管道字符,如下所示:
{{ name|lower }} 意思為 {{ name }} 變量被過濾器 lower 處理后,大寫轉換為小寫。
過濾管道可以被套接,即一個過濾器管道的輸出又可以作為下一個管道的輸入: {{ my_list|first|upper }} 以上實例將第一個元素并將其轉化為大寫。
有些過濾器有參數。 過濾器的參數跟隨冒號之后并且總是以雙引號包含。 例如: {{ bio|truncatewords:"30" }} 這個將顯示變量 bio 的前30個詞。
其他過濾器:
addslashes : 添加反斜杠到任何反斜杠、單引號或者雙引號前面。
date : 按指定的格式字符串參數格式化 date 或者 datetime 對象,實例:{{ pub_date|date:"F j, Y" }}
length : 返回變量的長度。
include 標簽
{% include %} 標簽允許在模板中包含其它的模板的內容。
這個例子都包含了 nav.html 模板: {% include "nav.html" %}
模板繼承
模板可以用繼承的方式來實現復用。接下來我們先創建之前項目的 templates 目錄中添加 base.html 文件,代碼如下:
HelloWorld/templates/base.html 文件代碼:
Hello World!
菜鳥教程 Django 測試。
{% block mainbody %}
original
{% endblock %}
以上代碼中,名為 mainbody 的 block 標簽是可以被繼承者們替換掉的部分。所有的 {% block %} 標簽告訴模板引擎,子模板可以重載這些部分。
如hello.html 繼承 base.html,并替換特定 block.hello.html 修改后的代碼如下:
HelloWorld/templates/hello.html 文件代碼:
{%extends "base.html" %} #這行說明 hello.html 繼承了 base.html 文件
{% block mainbody %} #可以看到,這里相同名字的 block 標簽用來替換 base.html 里相應 block。
繼承了 base.html 文件
{% endblock %}
重新訪問地址 http://127.0.0.1:8000/hello,就會輸出"繼承了 base.html 文件".
Django表單處理知識
參考 http://www.runoob.com/django/django-form.html
Django之Form組件的使用
參考 https://docs.djangoproject.com/zh-hans/2.1/topics/forms/ 官網
參考 https://www.cnblogs.com/wupeiqi/articles/6144178.html
Django的Form主要具有一下幾大功能:
* 生成HTML標簽
* 驗證用戶數據(顯示錯誤信息)
* HTML Form提交保留上次提交數據
* 初始化頁面顯示內容
Django中解決Not Found: /favicon.ico報錯
參考: https://blog.csdn.net/HHTNAN/article/details/78549561
在對應的html中的head里添加如下內容,將該圖片文件指向到固定文件夾.
{% load staticfiles %}
django-simple-captcha 驗證碼(圖片驗證)插件使用 以及添加動態ajax刷新驗證
參考: https://blog.csdn.net/tanzuozhev/article/details/50458688
如果當前驗證碼看不清,我們可以刷新一下,這個我們用ajax來做。 jango-simple-captcha本身提供了一個刷新頁面,/refresh 在captcha/urls.py中:
url(r’refresh/$’, views.captcha_refresh, name=’captcha-refresh’)
這里在我們自己的urls.py中可以不做處理,直接使用 /captcha/refresh/ . views.captcha_refresh 源碼:
以下只是源碼介紹不用寫入自己的代碼中
def captcha_refresh(request):
""" Return json with new captcha for ajax refresh request """
if not request.is_ajax(): # 只接受ajax提交
raise Http404
new_key = CaptchaStore.generate_key()
to_json_response = {
'key': new_key,
'image_url': captcha_image_url(new_key),
}
return HttpResponse(json.dumps(to_json_response), content_type='application/json')
通過閱讀源代碼我們發現, views.captcha_refresh 只接受ajax提交,最后返回 key 和 image_url 的json數據,這里的key就是 hashkey, 需要我們寫入id為id_captcha_1的隱藏字段, image_url為驗證碼圖片的新url,這里我們加入ajax刷新,點擊驗證碼圖片即可實現刷新,將以下內容添加到login.html 中即可實現點擊驗證碼圖片自動刷新自身.
Django項目里自建的腳本通過Django訪問DB.自建腳本通過Django來執行.
2019/01/17
一并解決1,2兩個報錯,參加下方"其他說明"->"3"內容.
以下是分步解決的.
1.報錯內容:(沒有環境變量DJANGO_SETTINGS_MODULE)
django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
配置方式為: pycharm右上角,進入"Edit Configrations..."->Python->選擇需要單獨運行的腳本->配置Environment variables->如下:
PYTHONUNBUFFERED=1;DJANGO_SETTINGS_MODULE=login_regs.settings
其中"DJANGO_SETTINGS_MODULE=login_regs.settings"是額外增加的一行.
2.報錯內容
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
則需要在該腳本的最上方(第一個import上面)添加如下:
import django
django.setup()
其他說明:
1.新加的腳本(或者是通過python manage.py startapp aliyun_ecs 生成的),無需在setting里配置INSTALLED_APPS.因為這個腳本是單獨運行的.
2.該腳本在未啟動Django主項目(比如login_regs未run的時候)也是可以自己運行的.
3.也可以只修改腳本文件,一并解決1,2兩個報錯.解決方法是,在get_ecs_info.py文件(需要運行的獨立腳本)的最上面添加如下代碼(不需要在pycharm右上角修改"Edit Configrations..."):
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "login_regs.settings") # login_regs是主項目,也就是根目錄.
django.setup()
django model中的save()方法 models.Server().save()
2019/01/18
Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)
一般只需
new_server = models.Server() # Server是在models.py里創建的表格
new_server.save()
id和pk
如果一個model里沒有顯示聲明哪一個字段(field)是主鍵(即在某個字段里聲明primary_key=True),則django會自動生成一個名為id的AutoFields作為主鍵。model里的主鍵都有一個別名叫做pk(primary_key的縮寫),無論這個主鍵是自動生成的還是我們指定的。
使用pk和使用主鍵的名字是一樣的效果。
注意1:對于一個要新加入數據庫的model實例,在save()執行之前是無法知道它的id的,因為要算數據庫中已有多少個本model才能算出它的id值。
b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
b2.id # Returns None, because b doesn't have an ID yet.
b2.save()
b2.id # Returns the ID of your new object.
save()到底是執行insert還是update的說明
force_update和force_insert
這兩個參數一般較少用到,因為執行save()之后,django默認執行的是UPDATE或者INSERT這兩條SQL語句的哪一條,遵循如下算法:
1.如果這個對象已經有主鍵而且主鍵的值是True的(即不是None或者空字符串等),就執行UPDATE。
2.如果沒有主鍵或者這條save()不會update任何字段,那么它就INSERT。
只有在某些特定情況下,需要強制save()執行INSERT或UPDATE時才會使force_update=True或force_insert=True(比如我要求能UPDATE就UPDATE,不能我也不取INSERT,那么我就把這個force_update參數設置為True)。
update_fields
用來指定哪些字段需要更新,別的不更新。默認是None,這樣所有字段都會更新一遍。有時候字段很多而我們只需要更新很少的字段,可以用這個參數來提高一下效率。注意要給它的是一個可迭代對象(比如list等)。如果給它一個空的可迭代對象,那么就什么都不更新(注意和None不同,如果等于None是更新全部字段)。
一旦update_fields參數不使用默認值None,那么這條save()語句就是強制執行UPDATE的。
product.name = 'Name changed again'
product.save(update_fields=['name'])
objects.filter()用法
2019/01/18
示例
多個filter一起使用(多個過濾條件)
def record_delete(): # 其中Server是DB的一張表
# 刪除自動記錄且沒有添加過備注信息的record.2個filter
models.Server.objects.filter(get_mode_type='自動錄入').filter(mark='').delete()
# 刪除自動記錄,且很久都沒有更新過的record(比如大于一周,則說明云平臺上已經沒有該服務器了)
now_today = datetime.datetime.now()
previously_days = datetime.timedelta(days=2)
interval = now_today - previously_days # 返回值類似 2019-01-12 15:24:11.531584
models.Server.objects.filter(get_mode_type='自動錄入').filter(c_time__lte=interval).delete() # c_time是DB里的一個字段,__lte是小于等于
使用說明
條件選取querySet的時候,filter表示=,exclude表示!=。如:
host_ip_list = models.Server.objects.exclude(instance_status='stopped').values_list('project_name', 'server_name', 'wan_ip')
querySet.distinct() 去重復
__exact 精確等于 like ‘aaa’ __iexact 精確等于 忽略大小寫 ilike ‘aaa’
__contains 包含 like ‘%aaa%’ __icontains 包含 忽略大小寫 ilike ‘%aaa%’,但是對于sqlite來說,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一個list范圍內
__startswith 以…開頭
__istartswith 以…開頭 忽略大小寫
__endswith 以…結尾
__iendswith 以…結尾,忽略大小寫
__range 在…范圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
Django系統計劃任務 django-crontab計劃任務 自定義命令 三種方式
2019/01/29
參考:
https://www.jianshu.com/p/27f003149090
https://blog.csdn.net/qq_34971175/article/details/79430274
http://wiki.jikexueyuan.com/project/django-chinese-docs-18/6_4_2_Adding-custom-commands.html
直接通過系統cron執行(推薦)
調用aliyun的API/aws的API,將ECS/EC2寫入CMDB
19 * * * * export PYTHONIOENCODING='utf-8' && cd /home/admin/django-cmdb/aliyun_ecs/ && /usr/bin/python3 get_aliyun_ecs_info_linux.py
19 * * * * export PYTHONIOENCODING='utf-8' && cd /home/admin/django-cmdb/aws_ec2/ && /usr/bin/python3 get_aws_ec2_info_linux.py
cat get_aliyun_ecs_info_linux.py
因系統編碼,以及linux下python3調用的時候發生的一些找不到對應模塊等原因,故這個腳本只用于linux.
以下是為了便于python36直接調用本腳本(不通過django-cron和manage.py命令的方式)而加入的.主要為植入當前路徑.
import sys
import os
curPath = os.path.abspath(os.path.dirname(file))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
import django 和 django.setup() 必須放在最上方.否則無法加載配置.就無法使用Django.
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "login_regs.settings")
django.setup()
...
cat signature_auth_py3_linux.py
因系統編碼,以及linux下python3調用的時候發生的一些找不到對應模塊等原因,故這個腳本只用于linux.
該腳本適用于python3.x版本
本腳本調用的時候可以給一些參數,執行對應的操作
import sys
import os
from six.moves.urllib.parse import quote
from six.moves.urllib.parse import urlencode
import urllib
import base64
import hmac
from hashlib import sha1
import time
import uuid
from optparse import OptionParser
try:
import configparser
except:
from six.moves import configparser
import traceback
公共變量
access_key_id = ''
access_key_secret = ''
定義終端節點地址(服務節點)
handle_server_address = 'https://ecs.aliyuncs.com'
if os.name == 'nt':
CONFIGFILE = os.getcwd() + 'aliyun.ini'
else:
CONFIGFILE = os.getcwd() + '/aliyun.ini'
[Credentials] 是配置文件中的一個章節
CONFIGSECTION = 'Credentials'
cmdlist = '''接口說明請參考線上文檔'''
...
django-crontab實現定時任務
安裝django-crontab庫
這里使用pip安裝即可,在終端輸入以下命令即可 pip-3.6 install django-crontab
在工程里使用django-crontab
在django項目的settings.py的INSTALLED_APPS添加django-crontab,記得將此添加到自建的所有app的最前面.
django-crontab配置
django-crontab可以定時運行自定義命令和函數兩種方式
定時函數
在django項目的settings.py中添加以下命令
CRONJOBS = (
('*/1 * * * *', '你的app名.定時函數所在的py文件名.定時函數名'), # 每一分鐘執行一次你的定時函數
('0 0 1 * *', '你的app名.定時函數所在的py文件名.定時函數名', '> 輸出文件路徑和名稱'), # 定時函數輸出的內容到指定文件(如果該路徑不存在會自動創建)
)
定時命令
CRONJOBS = (
('10 12 * * *', 'django.core.management.call_command', ['要執行的命令']), # 在12點10分執行命令
)
定時任務的操作
python36 manage.py crontab add 添加定時任務 # 當你添加了或者修改的定時任務
python36 manage.py crontab remove 清除定時任務 # 當想刪除當前用戶所有定時任務
python36 manage.py crontab show 顯示定時任務
自定義manage.py運行命令
略
總結
以上是生活随笔為你收集整理的菜鸟教程(runoob.com)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP UI5应用里的页面路由处理
- 下一篇: 《DNF》哪套史诗最好 逆天史诗防具套装