久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Django Full Coverage(飛速入門)

 小仙女本仙人 2021-05-11

Django(個(gè)人推薦, 如果項(xiàng)目較大 需要協(xié)同開(kāi)發(fā), 建議使用django這種重量級(jí)框架, 如果類似于純api的后端應(yīng)用建議使用 flask, 輕量小巧 , 麻雀雖小五臟俱全)

1.Django是什么

 他是一個(gè)基于python語(yǔ)言的WEB框架
  • 為什么使用Django

    • 他是python中最大的框架集成很多api
    • 他是全球第五大框架(代表作豆瓣)
    • 適合開(kāi)發(fā)工期短,,效率高使用
  • Django的優(yōu)勢(shì)

    • 開(kāi)發(fā)效率高,功能強(qiáng)大
  • 通過(guò)wsgi模塊理解Django的工作集成原理

    • 路由分發(fā)器通過(guò)寫一個(gè)函數(shù)上傳一個(gè)字典,,如果傳進(jìn)來(lái)的environment.get('PATH_INFO')在字典中存在,就執(zhí)行對(duì)應(yīng)的函數(shù),,否則返回404f
  • wsgi是一種規(guī)范,,wsgiref是基于wsgi規(guī)范開(kāi)發(fā)的模塊

    • 雖然自己寫web server比較的麻煩,但是我們也從中了解了web框架的本質(zhì)
      • 瀏覽器是socket客戶端,,網(wǎng)站是socket服務(wù)端
      • wsgi是一種web server開(kāi)發(fā)的規(guī)范,,wsgiref實(shí)現(xiàn)了這個(gè)規(guī)范并在其內(nèi)部實(shí)現(xiàn)了socket服務(wù)端
      • 根據(jù)url的不同執(zhí)行不同的函數(shù) - 路由分發(fā)
      • 函數(shù)?。√幚順I(yè)務(wù)邏輯的進(jìn)程
      • 圖案css js文件統(tǒng)一稱為靜態(tài)文件,,需要讀取內(nèi)容直接返回給用戶瀏覽器

2.創(chuàng)建Django項(xiàng)目

  • django-admin.py startproject my_site 創(chuàng)建my_site項(xiàng)目

    • 創(chuàng)建成功后會(huì)有幾個(gè)默認(rèn)的文件
      • manage.py # 管理程序的文件,啟動(dòng)和結(jié)束等
      • my_site #
        • init.py
        • settings.py # 程序的配置文件 - 數(shù)據(jù)庫(kù)配置之類的
        • urls.py # 程序的路由系統(tǒng)
        • wsgi.py # 指定框架的wsgi
    • 在my_site大項(xiàng)目下創(chuàng)建app每一個(gè)業(yè)務(wù)線都要有一個(gè)app
      • 創(chuàng)建app django-amdin.py startapp app01
      • ├── admin.py  數(shù)據(jù)庫(kù)管理后臺(tái)
        ├── apps.py  django把項(xiàng)目和app 關(guān)聯(lián)起來(lái)的一個(gè)文件
        ├── init.py
        ├── migrations 與數(shù)據(jù)庫(kù)相關(guān)
        │ └── init.py
        ├── models.py  數(shù)據(jù)庫(kù)增刪該查操作的文件
        ├── tests.py  單元測(cè)試
        └── views.py  業(yè)務(wù)邏輯函數(shù)代碼存放的位置
  • 第一次django請(qǐng)求

    • 1.首先匹配路由,,查找對(duì)應(yīng)的url對(duì)應(yīng)的關(guān)系,,找到了就調(diào)用返回頁(yè)面,否則404
    • 2.業(yè)務(wù)函數(shù),執(zhí)行業(yè)務(wù)邏輯
    • 3.返回?cái)?shù)據(jù)給瀏覽器

?啟動(dòng)django web服務(wù)器 python3 manage.py runserver 0.0.0.0:8000

?retrun HttpResponse方法返回我們定義的數(shù)據(jù)

3.模板初探

  • 1.配置settings DIRS
  • 2.配置views.py  return render(request,'form.html')
  • MVC & MTV
    • m model 模型 一般對(duì)數(shù)據(jù)庫(kù)操作,,數(shù)據(jù)的存取 models.py
    • v views 視圖 決定著如何展示數(shù)據(jù) views.py
    • c controller 控制器 負(fù)責(zé)處理用戶交互的部分,,控制器負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,,并向模型發(fā)送數(shù)據(jù). urls.py

Django是一個(gè)MTV框架,,其框架模板上看起來(lái)和傳統(tǒng)的MVC架構(gòu)沒(méi)有什么太大的區(qū)別.

Django將MVC中的視圖進(jìn)一步分解為Django視圖和Django模板兩個(gè)部分

?- Django中的html文件就是模板 視圖就是views.py

  • T 就是Templates 數(shù)據(jù)展示

    在Django的MTV框架中MVC C控制器部分由Django框架的urlconf來(lái)實(shí)現(xiàn)代替

    嚴(yán)格來(lái)說(shuō)Django是MVTC C被實(shí)現(xiàn)替代了

urls.py文件中 re_path是使用正則匹配用戶請(qǐng)求的url 主要配合動(dòng)態(tài)路由

  • Django路由的匹配心法

    • Django 在2.0之后使用了新的語(yǔ)法path,不使用re_path

    • path('articles/<int:arg1>/<month:arg2>/<int:arg3>', views.kw)
      
    • str 字符串  除了/ 之外的任何字符串都能匹配

    • int 匹配任意數(shù)字  

    • slug 匹配任意的**-**-**

    • uuid 匹配uuid格式的,特定場(chǎng)景下才會(huì)使用的到

    • path / + str 可以匹配到/

  • 使用include管理app下的url 

    • 在頂級(jí)的urls.py文件中導(dǎo)入from django.urls import include

    • path('app01/',include('app01.urls')),
      
  • Django的模型(admin文件的操作)

    • views中操作數(shù)據(jù)庫(kù)
    • 自己寫sql語(yǔ)句的問(wèn)題 - 有sql注入的風(fēng)險(xiǎn),,代碼與sql寫死在一起了,,導(dǎo)致解耦性差,開(kāi)發(fā)人員的sql水平層次不齊,,導(dǎo)致性能可能會(huì)變差,,開(kāi)發(fā)效率低下

4.ORM的引出

  • ORM是什么?

    • 對(duì)象關(guān)系映射,,他的實(shí)質(zhì)就是將關(guān)系數(shù)據(jù)庫(kù)中的業(yè)務(wù)數(shù)據(jù)用對(duì)象的形式表示出來(lái),,并通過(guò)面向?qū)ο蟮姆绞綄⑦@些對(duì)象組織起來(lái),實(shí)現(xiàn)系統(tǒng)業(yè)務(wù)邏輯過(guò)程
    • ORM中最重要的概念就是映射,,通過(guò)這種映射可以使業(yè)務(wù)對(duì)象與數(shù)據(jù)庫(kù)分離,,從面向?qū)ο髞?lái)說(shuō),數(shù)據(jù)庫(kù)不應(yīng)該和業(yè)務(wù)邏輯綁定到一起,,ORM則起到這樣的分離作用,,使數(shù)據(jù)庫(kù)層透明,開(kāi)發(fā)人員真正的面向?qū)ο螅?/li>
  • ORM的作用

    • 實(shí)現(xiàn)了代碼與數(shù)據(jù)庫(kù)操作的解耦
    • 不需要自己寫原生的sql,,提高了開(kāi)發(fā)效率
    • 有效的防止了sql注入
    • 缺點(diǎn)
      • 犧牲性能?。?duì)象轉(zhuǎn)換成原生的sql
      • 復(fù)雜語(yǔ)句難以實(shí)現(xiàn)
  • ORM映射字段的語(yǔ)法

    • AutoField (設(shè)置自增)

    • BigAutoField (設(shè)置更大的自增)

    • BigIntegerField (更大的整數(shù))

    • BinaryField (二進(jìn)制的數(shù)據(jù))

    • BooleanField (布爾類型的數(shù)據(jù))

    • CharField (字符串類型的數(shù)據(jù))

    • DateField (年與日時(shí)間類型)

    • DataTimeField(精確到時(shí)分秒的時(shí)間類型)

    • DecimalField ()

    • DurationField()

    • EmailField(郵箱類型)

    • FileField(存儲(chǔ)文件的類型)

    • FloatField(浮點(diǎn)數(shù)類型)

    • ImageField(圖片類型)

    • IntegerField(整數(shù)類型)

    • GenericIPAddressField(ipv4地址類型)

    • NullBooleanField (允許boolean類型為空)

    • TextField(大的文本)

    • ForeignKey(外鍵關(guān)聯(lián))

    • ManyToManyField(多對(duì)多)

    • OneToOneField(1對(duì)1)

  • 將models文件中的類同步到mysql數(shù)據(jù)庫(kù)中(必須要注意models文件中的外鍵和多對(duì)多要一一對(duì)應(yīng))

    • 在Django官網(wǎng)找到數(shù)據(jù)庫(kù)的配置https://docs./en/3.0/ref/settings/#databases  寫到settings文件當(dāng)中

    • 在項(xiàng)目下的init.py文件中寫入

    • import pymysql
      pymysql.version_info = (1, 3, 13,"final",0)
      pymysql.install_as_MySQLdb()
      
    • 創(chuàng)建數(shù)據(jù)庫(kù)mysql> create database blogdatabase charset utf8;

    • 在settings文件中設(shè)置INSTALLED_APPS 加上app的名字

    • 使用Django數(shù)據(jù)庫(kù)的同步工具migrations

      • 1.生成同步文件 python manage.py makemigrations
      • 2.同步數(shù)據(jù)庫(kù) python manage.py migrate
  • 使用ORM映射插入數(shù)據(jù) 首先 python manage.py shell

    • 普通創(chuàng)建

       >>> models.Account.objects.create(
       >>> ... username = 'jeke',
       >>> ... email = '[email protected]',
       >>> ... password = '123',
       >>> ... )
      
    • 外鍵關(guān)聯(lián)創(chuàng)建

      >>> o = models.Article(
      >>> ... title = '我是Peter',
      >>> ... content = 'xixi',
      >>> ... pub_data = '2020-6-11')
      >>> o
      >>> <Article: Article object (None)>
      >>> o.account_id = 1
      >
      >>> o.save()
      
    • 多對(duì)多的創(chuàng)建數(shù)據(jù)

      • 先創(chuàng)建完對(duì)象在關(guān)聯(lián)o.tags.set([id,id]) 這是覆蓋性設(shè)置
      • o.tags.add(id,id) 這是添加
  • ORM對(duì)數(shù)據(jù)進(jìn)行查詢(后來(lái)找到的查詢語(yǔ)法https://www.cnblogs.com/ls1997/p/10955402.html)

    • models.Account.objects.all() ==> select *

    • models.Account.objects.filter(id=1) ==> select * where id=1

    • models.Account.objects.filter(id__gt=1) ==> where id > 1

    • models.Account.objects.filter(id__gt=1,password='111') ==> where id >1 and password ='111';

    • models.Account.objects.filter(password__startswith=1) ==> where password like '1%'

    • models.Account.objects.filter(username__contains='zj') ==> 只要username包含大小寫的zj

    • models.Account.objects.filter(username__icontains='zj') ==> 只能匹配到小寫的zj

    • models.Account.objects.filter(id__in=[1,2]) ==> where id in (1,2)

    • models.Account.objects.filter(username__endswith='j') ==> where username like '%j'

    • 日期的待補(bǔ)充

    • filter正則表達(dá)式

      • models.Account.objects.filter(username__regex=r'(zj|j)$') 以zj或者j結(jié)尾
      • models.Account.objects.filter(username__iregex=r'(zj|j)$')  加上i就是大小寫不敏感都匹配
    • 上邊拿到的都是queryset的對(duì)象,不是數(shù)據(jù),,想要拿到數(shù)據(jù)可以使用很多方法

      >>> a =  models.Account.objects.filter(username__regex=r'(zj|j)$')
      
      >>> b = a.values() 
      
      >>> b.values('id').order_by('id')  #升序
      <QuerySet [{'id': 2}, {'id': 3}]>  
       
      >>> b.values('id').order_by('-id')
      <QuerySet [{'id': 3}, {'id': 2}]>  #降序
       
      >>>  *想要用reverse 必須要用先order_by排序*
      
      >>> b.values('id').order_by('-id').reverse()  #翻轉(zhuǎn)
      <QuerySet [{'id': 2}, {'id': 3}]>
      
      >>> b.values('id').order_by('id').reverse().first()  #取最后一個(gè)值,,先翻轉(zhuǎn)在取第一個(gè)
      {'id': 3}
      

5.ORM語(yǔ)句總結(jié)

  • a = models.Account.objects.get(id=1) 精確查詢某一字段 #返回的是真實(shí)的對(duì)象了,不是queryset對(duì)象了

    直接調(diào)用a.id a.username 即可

  • models.Account.objects.exclude(id=1)
    <QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>

get 返回一個(gè)對(duì)象,,沒(méi)有或者多個(gè)會(huì)報(bào)錯(cuò),不常用但是要不filter查詢速率快

filter 返回多個(gè)對(duì)象

all 返回所有數(shù)據(jù) 

exclude 排除符合匹配條件的數(shù)據(jù),,返回其他的數(shù)據(jù)

  • 修改和刪除操作
  • 修改全部
>>> models.Account.objects.exclude(id=1).update(password='1234656')  #批量修改只要是id不等于1的密碼都改成123456
  • 單條修改(先get在賦值后保存)
>>> a = models.Account.objects.get(id=1)
>>> a.password = '123456789'
>>> a.save()
  • 批量刪除,關(guān)聯(lián)的表的數(shù)據(jù)也會(huì)刪除或者變成設(shè)置的默認(rèn)的
>>> models.Account.objects.get(password='123456').delete()
  • 單條刪除
>>> a = models.Account.objects.get(id=1)
>>> a.delete()

外鍵關(guān)聯(lián)操作(模塊創(chuàng)建)

正向外鍵關(guān)聯(lián)(在有關(guān)聯(lián)字段的表中查詢)

>>> a = models.Article.objects.create(title = 'hahahaha322332', content = '阿光高你剛42151啊方法',account_id = 8 ,pub_data = '2020-06-12') 

>>> a.account.id  # a 定義的是Article的數(shù)據(jù),,但是可以通過(guò)外鍵關(guān)聯(lián)到Account 查詢到Account的數(shù)據(jù)

反向外鍵關(guān)聯(lián)(無(wú)關(guān)聯(lián)字段的表中查詢, ORM會(huì)自動(dòng)的幫助我們創(chuàng)建一個(gè)表)

>>> obj = models.Account.objects.all()[0]
>>> obj.article_set.all()
<QuerySet [<Article: Article object (6)>]>
>>> obj.article_set.all().values()
<QuerySet [{'id': 6, 'title': 'hahahaha', 'content': '阿光高你剛啊方法', 'account_id': 4, 'pub_data': datetime.date(2020, 6, 12)}]>

多對(duì)多關(guān)聯(lián)

>>> a.tags.all()

>>> t = models.tag.objects.all()[1]

>>> t.article_set.all()

6.Django Admin (組件)

admin 是Django自帶的讓你用來(lái)進(jìn)行數(shù)據(jù)庫(kù)管理的web app

提供了很多定制化的功能,,你甚至可以用它來(lái)進(jìn)行公司內(nèi)部的內(nèi)容管理

首先創(chuàng)建登錄的用戶 >> python3 manage.py createsuperuser

如果app01想要被管理的話,必須授權(quán)允許管理admin.py文件寫入下面的內(nèi)容

from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.Account)
admin.site.register(models.Article)
admin.site.register(models.Tag)

開(kāi)啟Django >> python3 manage.py runserver 0.0.0.0:8000

打開(kāi)localhost:8000/admin 就可以看到對(duì)應(yīng)的數(shù)據(jù)庫(kù)進(jìn)行操作了

7.定制Django admin

from django.contrib import admin
from app01 import models


class AccountAdmin(admin.ModelAdmin):
    list_display = ('username', 'email', 'signature')  # 顯示這三個(gè)字段
    search_fields = ('username', 'email','signature')  # 加入搜索按鈕
    list_filter = ('email', )  # 過(guò)濾, 針對(duì)重復(fù)的字段過(guò)濾
    list_per_page = 2  # 設(shè)置分頁(yè)
    # list_display_links = ('email',)

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'content', 'account', 'pub_data')
    list_filter = ('account', 'pub_data')
    search_fielshituds = ('title',)

fields = ('title', 'content', ('pub_data', 'account', 'tags'))  # 設(shè)置admin修改創(chuàng)建頁(yè)面可修改的數(shù)據(jù)

exclude = ('account',)   # 排除不顯示一些字段

    date_hierarchy = 'pub_data'  # 按照時(shí)間的分組(只能用時(shí)間)
    fieldsets = (
        ('文章基本信息', {
            'fields': ['title', 'content'],
                       },
         ),
        ('高級(jí)選項(xiàng)', {
            'fields': ['account', 'tags', 'pub_data'],
            'classes': ('collapse',),   # 讓這個(gè)高級(jí)選項(xiàng)變成有收縮折疊功能
                    }
         )
    )
    filter_horizontal = ('tags',)  # 只能針對(duì)多對(duì)多

filter_vertical = ('tags',)

radio_fields = {'account': admin.VERTICAL}  # 將下拉框變成按鈕以供選擇

    autocomplete_fields = ['account',]
    readonly_fields = ('title',)  # 設(shè)置只讀字段

admin.site.register(models.Account,AccountAdmin)
admin.site.register(models.Article,ArticleAdmin)
admin.site.register(models.Tag)

  • 自定義Admin字段

    在models文件中寫入

    def get_comment(self):   
    return 10
    

    再在admin對(duì)應(yīng)的庫(kù)中加上list_display = ('get_comment',) 字段

    • 自定義字段名在,models中修改

    • signature = models.CharField("簽名", max_length=255, null=True)  # null允許值為空,簽名
      
    • 自定義表名 在models文件中類中加入

     class Meta:   
     # verbose_name = "用戶列表"  # 針對(duì)英文的    
     verbose_name_plural = '用戶列表'  # 針對(duì)中文的
    

8.views 視圖(views文件的操作)

  • 視圖中的字段拋開(kāi)講解

  • HttpRequest對(duì)象屬性

    • 他封裝了本次請(qǐng)求所涉及的用戶瀏覽器端數(shù)據(jù),,服務(wù)器端數(shù)據(jù)等,,在views里可以通過(guò)request對(duì)象來(lái)調(diào)取相應(yīng)的屬性
    • request.scheme ==> 查看是https 協(xié)議還是http
    • request.path == > 返回的是當(dāng)前請(qǐng)求的url
    • request.method  ==> 查看獲取網(wǎng)頁(yè)的方法 post get put delete
    • request.content_type ==> 返回mime的類型
    • request.GET  ==> 打印網(wǎng)頁(yè)GET請(qǐng)求的參數(shù)
    • request.POST ==> 打印網(wǎng)頁(yè)P(yáng)OST請(qǐng)求的參數(shù)
    • request.COOKIE ==> 獲取瀏覽器的cookie數(shù)據(jù)
    • request.FILES == > 拿到通過(guò)前端頁(yè)面上傳來(lái)的文件,放到內(nèi)存當(dāng)中
    • request.POST.get("test_f")  ==> 拿到選擇文件的文件名
    • request.META   ==> 返回所有的請(qǐng)求頭
  • 除了屬性HttpRequest的方法

    • request.get_host() ==> 返回網(wǎng)站服務(wù)器地址,,example: '127.0.0.1':'8000'
    • request.get_port() ==> 返回服務(wù)器主機(jī)端口
    • request.get_full_path() ==> 返回請(qǐng)求的路徑
    • request.build_absolute_uri(locaiton) ==> 返回請(qǐng)求完整的url
    • request.is_srcure()  ==> 判斷他是不是https
    • request.is_ajax() ==> 判斷是否是ajax請(qǐng)求
  • Httpresponse(content_type格式參考手冊(cè)https://www.w3school.com.cn/media/media_mimeref.asp)

    • 設(shè)置下載文件的方法

      def download(request):
          f = open("static_data/15s第三方軟件設(shè)備適配情況.xlsx", 'rb')
          res = HttpResponse(f.read(),content_type='application/vnd.ms-excel')  # 設(shè)置返回的內(nèi)容格式為excel文檔格式
          res['Content-Disposition'] = 'attachment; filename ="15s.xlsx"'  # 設(shè)置用戶請(qǐng)求的時(shí)候下載下來(lái)的是一個(gè)attachement附件和文件名
          return res
      
    • 設(shè)置重定向

       def redirect(request):    
       return HttpResponseRedirect("/app01/download")
      
  • CBV(class base view) 類視圖

    • 使用類的方式來(lái)定義視圖,,提高代碼的可復(fù)用性,還可以加入判斷條件,還有繼承
from django.views import view

class TestView(View):

def get(self,request):

return HttpResponse("測(cè)試get請(qǐng)求自動(dòng)的使用這個(gè)get()函數(shù)")

def post(self,request):

return HttpResponse("測(cè)試post")

在url 定義的時(shí)候加入as.view()方法

path('class_view',view.TestView.as_view())

很久沒(méi)有整理之前的筆記了....

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多