0、html-socket
1 import socket 2 3 def handle_request(client): 4 request_data = client.recv(1024) 5 print("request_data: ", request_data) 6 client.send("HTTP/1.1 200 OK\r\nstatus: 200\r\nContent-Type:text/html\r\n\r\n".encode("utf8")) 7 client.send("<h1>Hello, luffycity!</h1><img src=''>".encode("utf8")) 8 9 def main(): 10 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 sock.bind(('localhost', 8812)) 12 sock.listen(5) 13 while True: 14 print("the server is waiting for client-connection....") 15 connection, address = sock.accept() 16 handle_request(connection) 17 connection.close() 18 19 if __name__ == '__main__': 20 main()
經常使用命令
pip3 install django==2.0.1 下載django django-admin.py startproject name 建立項目名字 python manage.py startapp name 建立應用名字 python manage.py runserver 啓動項目
一、wsgiref
1 from wsgiref.simple_server import make_server 2 def application(environ, start_response): 3 # 按着http協議解析數據:environ 4 # 按者http協議組裝數據:start_response 5 start_response('200 OK', [('Content-Type', 'text/html'), ("Charset", "utf8")]) 6 # 當前請求路徑 7 path = environ.get("PATH_INFO") 8 if path == "/favicon.ico": 9 with open("favicon.ico", "rb") as f: 10 data = f.read() 11 return [data] 12 13 # 封裝socket() 更加方便咱們獲取path,environ包含請求信息的字典 14 httpd = make_server('', 9988, application) 15 # 開始監聽HTTP請求: 16 httpd.serve_forever()
二、別名
1 STATIC_URL = '/static/' # 代指下面的絕對路徑 2 STATICFILE_DIRS = [ 3 os.path.join(BASE_DIR, "statics"), 4 ]
三、 有名分組
1 path("^articles/(?P<year>[0-9]{4})", handler) #handler(request, year)
四、 路由分發
1 from django.urls import include 2 path("^blog", include("app01.urls"))
3 request.path # /blog/articles/2018
4 request.get_full_path # /blog/articles/2018?a=2
五、 反向解析
1 path("^blog/(\d*)", views.login, name="Log") 2 action = "{% url 'Log' 56 %}" # html使用後端的別名 3 from django.urls import reverse 4 5 url = reverse("Log", args=(4029,)) 6 # 全局找完,找局部 7 # 經過別名在urlpatterns獲取匹配的url, 8 # 4029替換正則表達式,---># blog/56
六、 名稱空間
1 多個應用下的url別名重複 include() 放一個元組 路徑,名稱空間 2 # 後者會覆蓋前者 3 url(r'^app01/', include(("app01.urls","app01"))), 4 url(r'^app02/', include(("app02.urls","app02"))), 5 6 app01.urls: 7 urlpatterns = [ 8 url(r'^index/', views.index,name="index"), 9 ] 10 11 app02.urls: 12 urlpatterns = [ 13 url(r'^index/', views.index,name="index"), 14 ] 15 16 reverse("app01:index")
{% url "app01:index" 123 435%}
七、path param類型轉換
1 # 自定義方法: 2 class MonConvert: 3 regex = '[0-9]{2}' # 4 def to_python(self, value): # value 是由regex匹配到的字符串,返回具體的變量值,讓django傳遞到視圖函數中 5 return int(value) 6 def to_url(self, value): #和 相反,value是一個具體的Python變量值,返回其字符串,一般用於url反向引用。 7 # 反向解析 8 return "%04d"value 9 # 註冊轉換器 10 from django.urls import register_converter 11 12 register_converter(MonConvert, "my_convert") 13 path("^blog/<my_convert:year>", views.handler)
內置轉化器to_python
str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符
八、 模板語法 {{}} {% %} ------->html替換
1 渲染變量: {{ }} locals() 2 過濾器 3 {{ value | filter_name:參數 }} 4 default:"Nothing" # 若果變量爲空或者空,使用默認值 5 length # 字符串列表長度 6 filesizeformat # 文件大小 7 date:"Y-m-d" # datetime.datetime.now() 8 slice:"2:-1" 9 truncatechars:20 # 截斷字符 10 truncatewords:6 # 截斷單詞 11 upper # 大寫 12 lower # 小寫 13 add:10 # 加10 14 safe # 渲染標籤 15 16 標籤: {% %} 邏輯控制 17 -------------------------------------------- 18 {% for i in [] reversed %} # 反向循環 19 {%forloop.counter0%} # 序號從0開始 20 ...... 21 {% empty %} # 若是爲空,顯示下邊 22 ...... 23 {% endfor%} 24 -------------------------------------------- 25 {% if param %} 26 ...... 27 {% elif param %} 28 ...... 29 {% endif %} 30 -------------------------------------------- 31 {% with param=*******************%} 32 #{% with ******************* as param%} 33 {{ param }} 34 {%endwith%} 35 -------------------------------------------- 36 {% url "別名" %} 在form表單提交數據地址使用 37 -------------------------------------------- 38 {% cerf_token %} # CSRF 跨站請求僞造 39 # 當form表單包含再提交數據時,跳過CSRF檢測 40 render會包含一個隱藏的input標籤,有身份證號 41 -------------------------------------------- 42 ++++++++++++++++++++++++++++++++ 43 自定義過濾器|標籤 44 1、在settings中的INSTALLED_APP配置當前app,否則找不到自定義的過濾器 45 2、在app中建立templatetags文件(只能是這個名字) 46 三、建立****.py文件 47 from django import template 48 from django.utils.safestring import mark_safe 49 register = template.Library() #register的名字是固定的,不可改變 50 51 @register.filter 過濾器 52 def multi(x,y): 53 return x*y 54 55 @register.simple_tag 標籤 56 def multitag(x,y,z): 57 return x*y*z 58 59 @register.simple_tag 標籤 60 def my_input(id,arg): 61 result = "<input type='text' id='%s' class='%s' />" %(id,arg,) 62 return mark_safe(result) 63 64 四、在使用自定義simple_tag和filter的html中導入以前建立的****.py文件 65 {% load **** %} 66 5、如何調用 67 {{ i|my_filter:10 }} # 過濾器最多倆參數 68 {% if i|my_filter:10 >100 %} # 用於流程控制判斷 69 {% my_tag 7 8 %} # 標籤參數不限,沒有返回值 70 ++++++++++++++++++++++++++++++++
71 繼承標籤 72 {% include "****.html" %} # 導入***html 73 # 繼承base.html放在首行 {% block custom_ %} 。。。 {% endblock %} 74 {% extends "base.html" %} 75 1、重寫custom_盒子 76 {% block custom_ %}
。。。
{% endblock %} 77 2、重寫custom_盒子,且保留原有內容 78 {% block custom_ %} 79 {{ block.super }}
。。。 80 {% endblock custom_ %} # custom_增長可讀性,可不加
九、ormhtml
1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'orm', #你的數據庫名稱 5 'USER': 'root', #你的數據庫用戶名 6 'PASSWORD': '1234', #你的數據庫密碼 7 'HOST': '', #你的數據庫主機,留空默認爲localhost 8 'PORT': '3306', #你的數據庫端口 9 } 10 } 11 12 13 14 項目下__init__ 15 import pymysql 16 pymysql.install_as_MySQLdb() 17 18 19 顯示sql語句 20 LOGGING = { 21 'version': 1, 22 'disable_existing_loggers': False, 23 'handlers': { 24 'console':{ 25 'level':'DEBUG', 26 'class':'logging.StreamHandler', 27 }, 28 }, 29 'loggers': { 30 'django.db.backends': { 31 'handlers': ['console'], 32 'propagate': True, 33 'level':'DEBUG', 34 }, 35 } 36 }
# django 的日誌配置項 BASE_LOG_DIR = os.path.join(BASE_DIR,'log') LOGGING = { 'version': 1, # 保留字 'disable_existing_loggers': False, # 禁用已經存在的 logger 實例 'formatters': { # 詳細的日誌格式 'standard': { 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' '[%(levelname)s][%(message)s]' }, # 簡單的日誌格式 'simple': { 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' }, # 定義一個特殊的日誌格式 'collect': { 'format': '%(message)s' } }, # 過濾器 'filters': { # DEBUG = True 的狀況 才過濾 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, # 處理器 'handlers': { # 在終端打印 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], # 只有在Django debug爲True時纔在屏幕打印日誌 'class': 'logging.StreamHandler', 'formatter': 'simple' }, # 默認 'default': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日誌文件 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 通常配500M 'backupCount': 3, # 最多備份3個 'formatter': 'standard', 'encoding': 'utf-8', }, # 專門用來記 錯誤日誌 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日誌文件 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 'backupCount': 5, 'formatter': 'standard', 'encoding': 'utf-8', }, # 專門 定義一個 收集特定信息的日誌 'collect': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"), 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 'backupCount': 5, 'formatter': 'collect', 'encoding': "utf-8" } }, 'loggers': { # 默認的logger應用以下配置 '': { 'handlers': ['default', 'console', 'error'], # 上線以後能夠把'console'移除 'level': 'DEBUG', 'propagate': True, # 向不向更高級別的logger傳遞 }, # 名爲 'collect'的logger還單獨處理 'collect': { 'handlers': ['console', 'collect'], 'level': 'INFO', } }, }
from django.shortcuts import render,HttpResponse # Create your views here. import logging # 生成一個以當前文件名爲名字的logger實例 logger = logging.getLogger(__name__) collect_logger = logging.getLogger('collect') # 生成一個名爲collect的實例 def index(requset): logger.debug('一個debug萌萌的請求...') logger.info('一個info萌萌的請求...') ''' 這是視圖函數index的doc信息 :param requset: :return: ''' print('@'*120) print('這是app01裏面的index函數') # print(requset.s9) # raise ValueError('hehe,拋異常') # return HttpResponse('OK') rep = HttpResponse('OK') collect_logger.info('這是collect_logger日誌') collect_logger.info('hello:collect') # def render(): # return HttpResponse('不經常使用') # # rep.render = render return rep views
38 INSTALLED_APPS 要有對應的應用名
39 建立腳本:python manage.py makemigrations
40 同步數據庫: python manage.py migrate
APPEND_SLASH=True 是否會自動重定向(默認)
1 在Python腳本中調用Django環境 2 3 import os 4 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "項目名.settings") 5 import django 6 django.setup() 7 8 # 引用Django內部的變量
注意:python解釋器>3.4 運行django2.0前端
報錯 django.core.exceptions.ImproperlyConfigured: mysqlclient
1.3
.
3
or
newer
is
required; you have
0.7
.
11.None
python
-->若是使用更高版本的解釋器的話mysql
1 C:\Programs\Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 2 3 註釋掉 4 if version < (1, 3, 3): 5 raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required;
you have %s" % Database.__version__)
十、單表查詢
1 批量插入數據 2 Booklist=[] 3 for i in range(100): 4 Booklist.append(Book(title="book"+str(i),price=30+i*i)) 5 Book.objects.bulk_create(Booklist)
------------------增長記錄-------------------
1 1 # 添加表記錄 方式1 2 2 book_obj = Book(id=1, title="Py", price=100, pub_date="2012-12-12", publish="人民") 3 3 book_obj.save() 4 4 # 添加表記錄 方式2 5 5 book_obj=Book.objects.create(title="Py", price=100, pub_date="2012-12-12", publish="人民")
-------------------查找記錄-------------------
1 Book.objects.all() # QuerySet [obj1,obj2,obj3,...] 2 Book.objects.all().last() # obj | all()[-1] 3 Book.objects.all().first() # obj | all()[0] 4 Book.objects.filter(id=1, title="py") # QuerySet [obj1,...] 5 Book.objects.get(id=2) # get 只能獲得惟一的記錄 6 Book.objects.exclude(**kwargs) # 全部條件不匹配的對象 7 Book.objects.order_by() # 默認按id升序, order_by("-id") 8 Book.objects.all().reverse() # 反向排序 9 Book.objects.all().count() # QuerySet 對象的數量 10 Book.objects.filter().exists() # QuerySet是否包含數據 11 Book.objects.filter().values() # [{},{},{}] 12 Book.objects.filter().values_list() # [(),(),()] 13 Book.objects.filter().values().distinct() # [{},{},{}]
-----------------模糊查詢------------------------ 14 Book.objects.filter(price__gt=100) 15 Book.objects.filter(price__lt=100) 16 Book.objects.filter(price__range=[100, 200]) 17 Book.objects.filter(price__in=[100, 200, 300]) 18 Book.objects.filter(title__contains="python") 19 Book.objects.filter(title__icontains="python") # 忽略大小寫 20 Book.objects.filter(title__startswith="py") 21 Book.objects.filter(pub_date__year=2012) 22 Book.objects.filter(pub_date__month=8) 23 Book.objects.filter(pub_date__day=23) 24 Book.objects.filter(pub_date__week_day=5)
--------------------刪除記錄------------------
1 Book.objects.filter().delete() # QuerySet model對象 均可以用
--------------------修改記錄------------------
1 Book.objects.filter(title__startswith="py").update(price=120)
---------------------------------------------
十一、一對一
class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() # 一對一 authordetail = models.OneToOneField(to="AuthorDetail", to_field="nid", on_delete=models.CASCADE) def __str__(self): return self.name # 做者詳情表 class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday = models.DateField() telephone = models.BigIntegerField() addr = models.CharField(max_length=64)
十二、一對多
class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # 一對多關係 publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE, )# 級聯刪除 ''' publish_id INT , FOREIGN KEY (publish_id) REFERENCES publish(id) '''
往Auther插數據
book_obj=Book.objects.create(title="紅樓夢",price=100,publishDate="2012-12-12",publish_id=1) 或者 book_obj=Book.objects.create(title="三國演繹",price=100,publishDate="2012-12-12",publish=pub_obj) # 實際是publish===>publish_id 1=pub_obj.nid 替換 無論以哪一種方式添加數據book_obj.publish都是相對應的那個書對象
1三、多對多
class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() # 一對一 authordetail = models.OneToOneField(to="AuthorDetail", to_field="nid",
on_delete=models.CASCADE) def __str__(self): return self.name class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # 多對多 authors = models.ManyToManyField(to="Author") ''' CREATE TABLE book_authors( id INT PRIMARY KEY auto_increment , book_id INT , author_id INT , FOREIGN KEY (book_id) REFERENCES book(id), FOREIGN KEY (author_id) REFERENCES author(id) ) ''' def __str__(self): return self.title
1:第三張表添加數據 jquery
book_obj=Book.objects.create(title="瓶梅",price=100,publishDate="2012-12-12",publish_id=1)
book_obj.authors.add(1, 2, 3) # 添加了 (6,1)(6,2)(6,3)3條記錄
book_obj.authors # book_obj對應的全部author對象集合 QuerySet
book_obj.authors.set([]) #
2:第三張表解除數據git
book_obj.authors.remove(1, 2, 3) # 刪除了 (6,1)(6,2)(6,3)3條記錄 *【】 book_obj.authors.clear() # 刪除了全部記錄
-----跨表查詢-------ajax
1 基於對象查詢 ------------->子查詢
一對多
# 正向查詢 ---靠字段 ----------------查找」瓶梅「對應的出版社------------------------------ Book (publish) ------------->Publish book_obj = Book.objects.filter(title="瓶梅").first() print(book_obj.publish.name) # 反向查詢 ---靠表名小寫_set ----------------查找人民出版社出版的瓶梅對應的書----------------------- publish_obj = Publish.objects.filter(name="人民出版社").first() book_list = publish_obj.Book_set.filter(title="瓶梅").values("title")
多對多
# 正向查詢 ---靠字段 # 反向查詢 ---靠表名小寫_set 查詢結果都是QuerySet
經過在 ForeignKey() 和ManyToManyField的定義中設置 related_name
的值來覆寫 FOO_set 的名稱。
tags = models.ManyToManyField( # 手動建立第三張表
to="Tag",
through='Article2Tag',
through_fields=('article', 'tag'),
)
class Article2Tag(models.Model):
nid = models.AutoField(primary_key=True)
article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE)
tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field='nid', on_delete=models.CASCADE)
class Meta:
unique_together = [
('article', 'tag'),
]
def __str__(self):
v = self.article.title + "---" + self.tag.title
return v
一對一正則表達式
# 正向查詢 ---靠字段 # 反向查詢 ---靠表名小寫 查詢結果都是一個model對象 ->一對一的關係嘛
例:翻譯成sql語句
select publish_id from Book where title="平媒"
select name from Publish where id=1
2 基於雙下劃線查詢 ------------->join查詢
filter ---對應where values ---對應字段
# 正向查詢 ---靠字段
ret = Author.objects.filter(name="alex").values("authordetail__telephone")
# 反向查詢 ---靠表名小寫來告訴ORM引擎join那張表
ret = AuthorDetail.objects.filter(author__name="alex").values("telephone")
練習:
手機號以110開頭的做者出版過的全部書籍名稱以及出版社名稱 #方式一 # 需求: 經過Book表join AuthorDetail表,Book與AuthorDetail無關聯,因此必須連續跨表 ret = Book.objects.filter(authors__authordetail__telephone__startswith="110").values("title","publish__name") # 方式二 ret = Author.objects.filter(authordetail__telephone__startswith="110").values("book__title",)
3 聚合和分組查詢
# 聚合函數 aggregate from django.db.models import Max, Min, Avg, Count ret= Book.objects.all().aggregate(自定義鍵值=Avg("price"),max_price=Max("price"))
# 分組查詢 annotate #----------單表查詢----------- # 單表模型.objects.values("group by的字段").annotate(avg_salary=Avg("salary")) # 結果:<QuerySet [{"avg_salary":***,"group by的字段":****}]> # 注意:在單表分組下,按着主鍵進行group by 是沒有任何意義的。 #-----------多表查詢----------- # 查詢每個出版社的名稱以及出版的書籍個數 # 方式一 ret = Publish.objects.values("name").annotate(Count("book__title")) # 方式二 ret = Publish.objects.values("nid").annotate(c=Count("book__title")).values("name","c") # 查詢每個做者的名字以及出版過的書籍的最高價格 ret = Author.objects.values("nid").annotate(max_price=Max("book__price")).values("name","max_price") # "每個"表模型.objects.values("nid").annotate(聚合函數(關聯表統計字段)).values(任意表裏的字段) # 統計不止一個做者的圖書 ret = Book.objects.values("pk").annotate(c=Count("authors__name")).filter(c__gt=1).values("title", "c")
4 F與Q查詢sql
from django.db.models import F,Q # F 當涉及字段值時 Book.objects.filter(comment_num__gt=F("read_num")) Book.objects.all().update(price=F("price")+10) # Q 更復雜的查詢 Book.objects.filter(Q(title="紅樓夢")|Q(price=100)) # 或 Book.objects.filter(Q(title="紅樓夢")&Q(price=100)) # 且
用來解決OR查詢操做的 .filter(Q(id=1) | Q(id=2)) .filter(Q(id=1) & Q(id=2)) class Q(tree.Node): # Connection types AND = 'AND' OR = 'OR' default = AND def __init__(self, *args, **kwargs): super(Q, self).__init__(children=list(args) + kwargs.items()) def _combine(self, other, conn): if not isinstance(other, Q): raise TypeError(other) obj = type(self)() obj.add(self, conn) obj.add(other, conn) return obj def __or__(self, other): return self._combine(other, self.OR) def __and__(self, other): return self._combine(other, self.AND) def __invert__(self): obj = type(self)() obj.add(self, self.AND) obj.negate() return obj 傳Q對象,構造搜索條件 首先仍是須要導入模塊: from django.db.models import Q 傳入條件進行查詢: q1 = Q() q1.connector = 'OR' q1.children.append(('id', 1)) q1.children.append(('id', 2)) q1.children.append(('id', 3)) models.Tb1.objects.filter(q1) 合併條件進行查詢: con = Q() q1 = Q() q1.connector = 'OR' q1.children.append(('id', 1)) q1.children.append(('id', 2)) q2 = Q() q2.connector = 'OR' q2.children.append(('status', '在線')) con.add(q1, 'AND') con.add(q2, 'AND') models.Tb1.objects.filter(con)
1四、ORM事務 ()原子
1 try: 2 from django.db import transaction 3 with transaction.atomic(): 4 new_publisher = models.Publisher.objects.create(name="新華出版社CCC") 5 new_book = models.Book.objects.create(titl="新華字典CCC", price=3.5, publisher=new_publisher) 6 except Exception as e: 7 print(str(e))
1五、request屬性
1 request.GET 2 一個相似於字典的對象,包含 HTTP GET 的全部參數。 3 4 request.POST 5 一個相似於字典的對象,包含表單數據。 6 若是使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。 7 注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,
須要用:request.POST.getlist("hobby") 8 9 Request.FILES 10 一個相似於字典的對象,包含全部的上傳文件信息。 11 FILES 中的每一個鍵爲<input type="file" name="" /> 中的name,值則爲對應的數據。 12 注意,FILES 只有在請求的方法爲POST 且提交的<form> 帶有enctype="multipart/form-data" 狀況下 13 纔會包含數據。不然,FILES 將爲一個空的相似於字典的對象。
14 request.body 15 一個字符串,表明請求報文的主體。在處理非 HTTP 形式的報文時很是有用. 16 17 request.path 18 一個字符串,表示請求的路徑組件(不含域名) 19 20 request.method 21 一個字符串,表示請求使用的HTTP 方法。 22 Request.encoding 23 24 一個字符串,表示提交的數據的編碼方式(若是爲None則表示使用 DEFAULT_CHARSET 的設置,默認'utf-8') 25 這個屬性是可寫的,你能夠修改它來修改訪問表單數據使用的編碼。 26 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。 27 若是你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。 28 29 Request.META 30 31 一個標準的Python 字典包含全部的HTTP 首部具體的頭部信息取決於客戶端和服務器,下面是一些示例 32 33 CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。 34 CONTENT_TYPE —— 請求的正文的MIME 類型。 35 HTTP_ACCEPT —— 響應可接收的Content-Type。 36 HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。 37 HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。 38 HTTP_HOST —— 客服端發送的HTTP Host 頭部。 39 HTTP_REFERER —— Referring 頁面。 40 HTTP_USER_AGENT —— 客戶端的user-agent 字符串。 41 QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。 42 REMOTE_ADDR —— 客戶端的IP 地址。 43 REMOTE_HOST —— 客戶端的主機名。 44 REMOTE_USER —— 服務器認證後的用戶。 45 REQUEST_METHOD —— 一個字符串,例如"GET" 或"POST"。 46 SERVER_NAME —— 服務器的主機名。 47 SERVER_PORT —— 服務器的端口(是一個字符串)。 48 從上面能夠看到,除 CONTENT_LENGTH 和CONTENT_TYPE以外,請求中任何HTTP首部轉換爲 META 的鍵時, 49 都會將全部字母大寫並將鏈接符替換爲下劃線最後加上 HTTP_ 前綴。 50 因此,一個叫作 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。
request.user.is_authenticated
1五、字段類型
1 # models.AutoField(primary_key=True) 2 # models.IntegerField() 3 # models.DecimalField(max_digits=5, decimal_places=2) # 000.00~999.99 4 # models.FloatField(max_digits=5,decimal_places=2) #000.00~999.99 5 # models.CharField(max_length=30) 6 # models.BooleanField() # True/False 7 # models.NullBooleanField() # Yes/No/Unknown 8 # models.TextField() # 大容量文本字段 9 # models.EmailField() 10 # models.DateField(verbose_name="描述", auto_now=True)
11 # models.DateTimeField()
auto_now_add # 建立這條數據時自動添加當前時間 auto_now # 每次更新的時候都自動更新時間
12 # models.CharField(max_length=32, default=None) 13 # models.IPAddressField() # IP地址 14 # models.ImageField(upload_to="",default=None,ehight_filed=100,width_filed=100) # 按照100*100像素保存 15 # models.FileField(upload_to="本地文件的路徑") 16 # FileField 或 ImageField 使用步驟,由於效率問題,不能直接存到數據庫 17 """ 18 一、在setting中配置MEDIA_ROOT路徑,以便在此處保存上傳文件 19 二、確保定義了upload_to選項, 20 """ 21 models.URLField(verify_exists=True) # 默認爲True,存入時會預先檢查是否存在(404)用text標籤
# media配置
MEDIA_URL='media/'# 前端訪問
MEDIA_ROOT= os.path.join(BASE_DIR,'media')
from django.views.static import serve
re_path('media/(?P<path>.*),server,{'document_root':settings.MEDIA_ROOT })
1六、字段參數
1 (1)null 2 3 若是爲True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False. 4 5 (1)blank 6 7 若是爲True,該字段容許不填。默認爲False。 8 要注意,這與 null 不一樣。null純粹是數據庫範疇的,而 blank 是數據驗證範疇的。 9 若是一個字段的blank=True,表單的驗證將容許該字段是空值。若是字段的blank=False,該字段就是必填的。 10 11 (2)default 12 13 字段的默認值。能夠是一個值或者可調用對象。若是可調用 ,每有新對象被建立它都會被調用。 14 15 (3)primary_key 16 17 若是爲True,那麼這個字段就是模型的主鍵。若是你沒有指定任何一個字段的primary_key=True, 18 Django 就會自動添加一個IntegerField字段作爲主鍵,因此除非你想覆蓋默認的主鍵行爲, 19 不然不必設置任何一個字段的primary_key=True。 20 21 (4)unique 22 23 若是該值設置爲 True, 這個數據字段的值在整張表中必須是惟一的 24 25 (5)choices 26 由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 若是設置了choices ,
默認的表單將是一個選擇框而不是標準的文本框,<br>並且這個選擇框的選項就是choices 中的選項。
1七、文件上傳
請求頭ContentType指的是請求體的編碼類型 1 application/x-www-form-urlencoded 最多見的get提交數據方式,Form表單默認,經過enctype設置 2 multipart/form-data 支持上傳文件,瀏覽器 原生支持以上兩種, 3 application/json ajax的上傳方式
var formdata=new FormData(); formdata.append("user",$("#user").val()); formdata.append("avatar_img",$("#avatar")[0].files[0]); $.ajax({ url:"", type:"post", data:formdata, processData: false , // 告訴jquery不要去處理髮送的數據 contentType: false, // 告訴jquery不要去設置Content-Type請求頭 success:function(data){
# var data=JSON.parse(data) # 反序列化
# var data=JSON.toString() # 序列化 console.log(data) }
1 if request.method == "POST": 2 print("body", request.body) # 請求報文中的請求體 3 print("POST", request.POST) 4 # if contentType==urlencoded ,request.POST纔有數據 5 print(request.FILES) 6 file_obj = request.FILES.get("avatar") 7 with open(file_obj.name, "wb") as f: 8 for line in file_obj: 9 f.write(line) 10 return HttpResponse("OK")
1 // 給每一個input框綁定獲取焦點以後清除以前錯誤提示的事件 2 $("input.form-control").on("focus", function () { 3 $(this).parent().removeClass("has-error").find(".help-block").text(""); 4 }); 5 6 // 點擊圖片刷新驗證碼 7 $("#id_valid_code+img").on("click", function () { 8 this.src += "?"; 9 }); 10 11 // 頭像預覽功能,當avatar input框的值發生變化時出發事件 12 $("#avatar").change(function () { 13 // 從本地讀取文件 14 var filePath = $(this)[0].files[0]; 15 var fileReader = new FileReader(); 16 fileReader.readAsDataURL(filePath); // 讀是須要時間的 17 fileReader.onload = function () { 18 $(".label-img").attr("src", fileReader.result); 19 };
1八、CBV\FBV
1 urlpatterns = [ 2 path('book_list/', views.HomeView.as_view(), name='book_list'), 3 ]
from django.conf import settings
1 from django.shortcuts import redirect 2 from django.utils.decorators import method_decorator 3 from django.views import View 4 from django.views.decorators.csrf import csrf_exempt 5 6 def check_login(): 7 pass 8 9 @method_decorator(check_login, "get") 10 class HomeView(View): 11 # csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。 12 # csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。 13 @method_decorator(csrf_exempt) # csrf相關裝飾器只能裝飾在dispatch上 14 @method_decorator(check_login) 15 def dispatch(self, request, *args, **kwargs): 16 return super(HomeView, self).dispatch(request, *args, **kwargs) 17 18 @staticmethod 19 def get(request): 20 return redirect("/index/") 21 22 @staticmethod 23 def post(request): 24 print("Home View POST method...") 25 return redirect("/index/")
django提供瞭如下幾個view View:基礎的view,實現了方法的分發,但沒有實現具體的get\post TemplateView:繼承自View,能夠直接用來返回指定的模板。實現了get方法,樂意傳遞變量到模板中進行數據展現 ;能夠同過集成此類,重寫get_content_data,傳遞數據 url("",TemplateView.as_view(template_name="about.html")) DetailView:繼承自View,實現了get方法,而且能夠綁定一個模板,進行數據展現
class PostDetailView(CommonViewMixin, DetailView): model = None # 指定當前View要使用Model,默認爲空 queryset = Post.objects.filter(status=Post.STATUS_NORMAL) # 和Model二選一,優先級更高,默認爲空 template_name = 'blog/detail.html' # 模板的名字 context_object_name = 'post' pk_url_kwarg = 'post_id' # url參數的key def get_queryset(self): self.context_object_name """用來獲取queryset,涉及到model以及queryset兩個字段""" return super(PostDetailView, self).get_queryset() def get_context_data(self, **kwargs): """ 獲取全部渲染到模板中的全部上下文 返回一個字典,{k:v} """ return super(PostDetailView, self).get_context_data(**kwargs) def get_object(self, queryset=None): """根據URL參數,從queryset上獲取對應的實例""" return super(PostDetailView, self).get_object(queryset)
ListView:繼承自View,實現了get方法,能夠同過綁定模板來批量獲取數據
1九、序列化
內置方法
def books_json(request): book_list = models.Book.objects.all()[0:10] from django.core import serializers ret = serializers.serialize("json", book_list) return HttpResponse(ret)
datetime對象,而json.dumps是沒法處理這樣在類型
class JsonCustomEncoder(json.JSONEncoder): """ 自定義一個支持序列化時間格式的類 """ def default(self, o): if isinstance(o, datetime): return o.strftime("%Y-%m-%d %H:%M:%S") elif isinstance(o, date): return o.strftime("%Y-%m-%d") else: return json.JSONEncoder.default(self, o) def books_json(request): book_list = models.Book.objects.all().values_list("title", "publish_date") ret = json.dumps(list(book_list), cls=JsonCustomEncoder) return HttpResponse(ret)
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() from app01 import models books = models.Book.objects.all() print(books)
十、時區問題
TIME_ZONE = 'Asia/Shanghai' USE_TZ = False
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
from urllib import parse v = parse.urlencode({'k1': 1, "k2": 2, "k3": 3}) print(v) # k3=3&k1=1&k2=2
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
十、單表查詢
from django.shortcuts import render from django.utils.safestring import mark_safe def test(request): a = mark_safe('<a href="http://www.cnblogs.com/0bug/">屠龍寶刀,點擊就送</a>') return render(request, 'test.html', {'a': a})