工做一月總結

目錄:html

  1:技術方面的收穫前端

  2:非技術層面的收穫與離職python

  3:一些零碎的知識點jquery

  4:離職緣由nginx

  5:感謝git

 

前言:ajax

  剛畢業,在上海擔路網工做了一個多月,從7.12號到8.20號。數據庫

  上海擔路網主要產品是服務於中小企業,幫其定製發佈PC網站,手機網站,微信公衆號等等,算是一個互聯網工具提供商。其主產品的主要技術構成是Django,Angular以及Tastypie。商家用戶在其設置界面(非Django的admin)輸入某項的對應數據(AngularJS)後(經過Angular的$Resource)接入到Tastypie的API從而操做Django的模型,經過Django的模板系統(用了很多Bootstrap的樣式)將其展現在此商家的用戶面前。還有個旁系產品是徹底的先後端分離的項目。django

 

一:技術方面的收穫json

注:有些回顧可能因爲時間緣由會遺忘或者出現一些問題

  • 第1,2周:

   

   雖然寫的是7.18的周任務,實際上是7.12,7.18兩週寫的,第一週第一天佈置環境,第二三天熟悉產品與代碼的對應,後面幾天寫的就沒有提交。

   寫的上面主要都是一些改動,Angular與Django方面的

   其中記錄兩個解決費時多一點的:

   1)其中的"與"&「或」查詢的實現:

      首先會想到使用Django的Q search

      通常使用以下:

      Poll.objects.get(        Q(question__startswith='Who'),        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))       )
      而個人需求是從一個Hbase形數據中提取,因此是動態的傳入一個dict而且實現或查詢。我很傻得半天不知道如何去拼接,哎,只知道string的+拼接,其實抽象出來都是同樣的,這裏換成Q object的|拼接就完了。
      search_conditions = Q()
      for k,i in dict.items():
        search_condition = search_condition | Q(k=i) 
   2) 查詢改爲POST提交
    因爲get提交的數據在url中會被服務器保存,因此在一些狀況下改成post提交表單。
    表單提交改成POST提交後的連帶問題是分頁,Django默認pagination是在url後經過/?page=n從而進入到get方法中,從而取出對應頁的數據。這裏的需求是將其改成post方法提交,可是依然是加入/?page=n到當前url,
也就是所在request.method=「POST」中依然從request.GET中獲取page參數。
    默認的使用以下:
    {% if contacts.has_previous %} <a href="?page={{ contacts.previous_page_number }}">previous</a> {% endif %}
    最後的解決辦法是阻止翻頁按鈕的默認提交,將翻頁按鈕的href屬性值加入到form的action中,而後點擊提交form。這樣的額外好處是還可以保持輸入
    大概代碼以下
    $("xxx").click(function(event){
      event.prevendefault();
      $("form").attr("action", $(this).attr("href"));
      $("form").submmit()
    }
  *要注意查詢次數與翻頁的關係,翻頁不該該增長查詢次數

  • 第三週

    這周測試那兒卡了整整一天半,各類排錯沒找出來,最後發現是基礎數據其中的一個字段忘加了,而程序中此字段在用於查詢時又是必須的(寫在Tastypie部分的build_filter方法中的)。
    順便記錄下使用FIXTURE仍是本身手動create的區別,對於與本次測試無關的輔助數據用FIXTURE,也就是幾乎不會去修改他,不然用create,這樣更explicit。

    關於PEP8記錄一點pycharm中的Code菜單欄的Inspect Code選項能夠檢測PEP8規範

   git相關的有點多,就不總結到這兒了。

 

  • 第四周   

  

 

  寫自定義表單WIZARD部分整整用了一週,此功能是組裏一個大神寫的,Angular部分寫的太猛,而後表單部分字段到前端的把模型類映射到表單類又棄用了Django自帶的Widget,細節有些不太懂,因此改的很頭疼,不會的時候有兩天回家還看文檔看到半夜,結果次日直接昏昏沉沉。

  後臺Angular部分效果以下:

  

  選擇右邊後添加到左邊表單,點擊表單後能夠編輯此field的一些設置。最後在前臺就可以直接出現此表單,填完後提交就多了條記錄。

  在此推薦一個找bootstrap樣式片斷的網站:http://bootsnipp.com/.  個人wizard樣式就是在這裏面輸入form wizard找到的。

 

  • 第五週

  

  這裏主要作的是將上面每一個字段項可以讓用戶分組,從而對應起每一步的wizard。

  對了,這裏有個注意點事外鍵約束的問題要考慮清楚,好比刪除分組但並不能刪除其裏面的字段,由於能夠選擇不用wizard顯示。可是默認的是要刪除的,因此須要設置on_delete=models.SET_NULL

  對了,還有個須要注意的是在數據庫新加字段最好考慮下後傾向寫成null=True,不然出問題後回滾比較麻煩

  話說請假回家三天,竟然在來回的火車上基本讀完了《鋒利的jquery》以及《Test-Driven Development with Python》兩本書

 

  • 第六週

  

  喏,待的最後一週的任務,其中dumpdata注意命令應該就是常使用下面的形式了:python manage.py dumpdata store.UserCategory --indent 4 --format json --pks 178,179,... > testdumpdata.json話說我當時看文檔不知爲什麼看漏了--pks參數,就發現無法取出某天特定數據,就用了在.py文件中查詢->序列化->再寫入文件的方法,其實這個方法挺好,能夠寫個腳步一次搞定完,可是問題在於可讀性,無法達到--indent 4的那種效果。

  一個卡的比較久的問題就是用例測試那兒了,因爲剛寫完單元測試,因此滿腦子還在那兒的節奏,寫了一大半才發現數據庫使用了真實數據庫而不是測試數據庫,其實文檔寫的很清楚使用Django.test.LiveServerTestCase的話會在後端8081端口啓動一個Django server,可是因爲思惟還在那兒這個一眼晃過沒有在乎。因此此時不該該再去訪問8000端口,如有nginx的upstream server也應該對應改到8081端口(固然,能夠本身指定端口號:https://docs.djangoproject.com/en/1.10/topics/testing/tools/)。這樣的話纔是使用的測試數據庫的數據。

  還有一個小問題是寫server name時不要把前面的http://加入,我圖方便,直接從瀏覽器中copy的,天然多了之,最後發現有之不行。聯繫下圖順便對應下window.location對象

  

 

二:非技術層面的收穫

  也是不知道爲何,這一個月關注的公衆號收到的關於性格討論的不少,加上本身的感覺總結起來大概就是下面幾點:

    自信,敢於接受新挑戰

    要有隻要步步分析,就必定可以解決問題的信念

    嚴格的作出邏輯分析而且步步求證,必定不能基於假設去求證

 

三:一些零碎的知識點

  這裏記錄一些碰到過的很傻的一些問題(主要是我基礎很差吧),因爲沒有隨手記下,發現遺忘了很多

  1. 關於Django模板變量與JS的聯繫問題
    1. 首先要明確的是模板變量在服務器端就會被賦值,而JS是在瀏覽器端執行的,因此在JS執行時對應東西已經被替換,這也牽扯出js並不可以改變模板中{{ xxx }}的問題。經常使用的有:
      1. 獲取string形:var sth = "{{ sth }}";
      2. 獲取其餘對象:如在Djang視圖中返回sth = json.dumps(dict(name="pd"))  # 若不轉化爲json形式的話可能會出現一些轉義

                    則在JS中 var sth = {{ sth }};便可轉化爲JS的object

      2. 若把js文件用引入的方式的話,在js文件中就沒法獲取模板變量了,解決方法是將其寫成函數,參數爲須要得到的模板變量,這樣在template中調用便可。

  2. 在Django 測試中post data,若使用json, 並不須要data=json.dumps(data), 寫好對應的content_type便可。注意與JS中的微妙區別(js中若是是簡單數據的話也不須要,不然最好序列化一下)

  3. 修改/host/etcs能夠將外部主機綁定到你但願的主機(通常是綁定到本地127.0.1.1)

  4. Django中用ajax post提交表單時別忘記了加csrf_token,這裏須要注意的是既能夠將之加入到header中,也能夠做爲data的一部分進行發送,不過前一種更好。經過jquery的.ajax不一樣的options能夠完成這兩種不一樣的加入。(注,每一個模板自帶變量{{ csrf-token }})

  5. 關於顯示html, 注意開啓{% autoescape on %},如果在js中想獲取帶html標籤的可用safe過濾器。注意js插入時用.html(哈哈,沒想到我習慣了寫.text()。搞得廢了半天勁)

  6. Django測試時,如果運行一個測試類,其每一個方法下使用的同一數據的PK是遞增的,故注意不要硬編碼

  7. 關於python的NoneType:http://stackoverflow.com/questions/21095654/what-is-a-nonetype-object

  8. 在Django中相比get後再if xx判斷存在與否不如使用filter(xxx).exists(). 

  9. 在Django中不要使用.first()去獲取,其原理是全取出來,轉化爲list,再切片取第一個,效率過低

  10. 因爲js的執行問題(或者是setTimeout等),有很多須要使用到回調函數確保你想要的東西已執行完畢

    其實回調函數實質就是傳入函數參數,在具體的時間執行

    function aha(callback){

      //...; 

      if( callback && type(callback) == "function"){

        callback();

      }

    }

  11. 處於瀏覽器兼容性考慮,最好用jquery而不是JavaScript

  12. Angular中同類view要想好究竟是改變url,仍是經過 「變量+ng-if」,仍是經過modal的方式來呈現,各有各的好處

  13. 關於在post提交時獲取數據時的request.body與request.POST:

    咱們習慣了在post提交時從request.POST中提取數據,之前看F12幫助時發現傳的都是字典類的數據,我就覺得get與post不一樣一點就是get與post提交數據形式不一樣,一個是?a=xx&b=xx, 而另外一個是{a:xx, b:xx},直到有一天看到Javascript ajax提交提倡都先使用stringfy函數序列化後上傳,結果一看其只能序列化成?a=xx&b=xx的形式,當時就納悶這樣post還如何提交啊?後來發現其實瀏覽器那樣只是爲了可讀性,實際仍是提交的?...形式(print request.body便可發現),而又因爲form提交與ajax提交使用的content-type不一樣,因此如果form提交,Django將之轉化爲了類字典的request.POST, 而ajax中提倡的json格式提交通常後面就反序列化request.body成dict就好了

    能夠參考這篇博文

  14. 因爲經常使用一些插件或者是bootstrap,對於其中某個樣式想要去改變的話有時會出現失敗的狀況,主要是由於被其自己寫的樣式覆蓋了,這時經過加入!important能夠實現提升優先級,從而不會被覆蓋掉。

  #  暫時想起來這些

 

四:離職緣由

  每週六天+天天加班+沒有任何形式的補助;沒有任何相似咖啡機啊什麼的東西(沒有公司文化,工程師文化)

  有點點不鼓勵本身去實現一些東西

  同事之間除了午餐沒什麼交流,也沒有任何按期互動或者活動什麼的。這樣的感受就是天天就是拼命幹活,沒有歸屬感

  在沒有歸屬感的狀況下工做壓力很大的話真是受不了,忽然間發現徹底沒有了生活,來了一個月就沒有出過這公司與家這兩點,公車和地鐵都沒上過,活的恍恍惚惚的,每週惟一的期待就是週日去超市逛逛可以多看見幾我的,以爲有有生氣。最終選擇了辭職

  其實我並不以爲加班有什麼,反正回家也是看東西學東西,可是以爲歸屬感比較重要。而歸屬感主要可能來自:產品自己,工程師文化,同事有沒有共同愛好(除了工做外的,好比踢足球,哈哈),...

 

五:感謝

  主要感謝主管張哥,雖然人生觀不一樣,可是這段時間教會了我很多東西,可以相對系統的給我講一些東西,又鼓勵培養我獨立解決問題。上面總結的一些東西大多都來自張哥的提醒或者講解。真的是十分感謝。

相關文章
相關標籤/搜索