成爲SaaS運維工程師:Django學習_製作微博網頁

設計一個微博網頁,包括前端後臺,用戶能夠註冊登陸,同時發微博,查看別人的微博,看自己的名片,退出等功能。效果如下:

(1)註冊登陸界面

(2) 進去之後查看微博(包括評論發表日期等)

 (3)自己發微博

(3)自己的名片,個人信息

(4)退出之後返回主頁面 

步驟:

1. 安裝django ,驗證在命令行 cmd: import django; django.get_version();

2. django-admin startproject <Project Name>

目錄中會出現manage.py文件

3. python manage.py startapp   <APP Name>

4. python manage.py runserver 80

5. 在你的<APP>目錄下建立文件夾/static/ 用於存放靜態文件,建立/templates/用於存放js,bootstrap,img等。

6. 我們在<Project>目錄,或者根目錄下,找到setting.py文件,在INSTALLED_APP 中添加APP,(注意逗號)。在TEMPLATES的DIRS添加模板路徑,'DIR':['/templates/']. 其他地方不變。

在html文件可以直接調用'/static/xx.img'或者'/static/js/jquery-1.11.2.min.js',效果如下:

7. 在<APP>目錄下views.py添加函數,比如

def home(request):
    return render(request,"homepage.html")

來進行網頁與後臺交互(渲染)

8. 最後在<Project>目錄下找到url.py。在utlpattern中添加  from <APP> import views.home

path('',home)  (注意是函數名,不加括號)

 

如何完成html與views.py的交互。在views.py的函數中添加字典user,並且在render函數中添加參數{"ref":user}。在html中用{{user.XX}}來引用,比如:

def show_user(request):
    customer1 = { 'Name': 'Bruce Lee',
             'motto': "HuHuHaHi",
             'email': '[email protected]',
             'region': 'Kyoto, Japan',
             'avatar': 'Po2.jpg'

    }
    return render(request,"user.html",{"user":customer1})  
              
<h1 style="font-size:70px">{{user.name}}</h1>

9. 編寫models  orm數據存儲模塊,比如我們建立一個1對1的表Wechatuser,再建立一個1對N的表Status,它們都必須繼承models.Model. CASCADE表示相關聯的表會被一起刪除。

from django.contrib.auth.models import User

class Wechatuser(models.Model):
    user = models.OneToOneField(User,models.CASCADE)#del
    motto = models.CharField(max_length = 100, null=True, blank = True)
    image = models.CharField(max_length=50, null=True, blank=True)#最大字符長度50,允許爲空
    region = models.CharField(max_length=60, null=True, blank=True)

    def __str__(self):
        return self.user.username #以用戶名字爲唯一標識符

class Status(models.Model):
    user = models.ForeignKey(Wechatuser,models.CASCADE)
    webot = models.CharField(max_length = 280)
    pics = models.CharField(max_length=100, null=True, blank=True)
    time = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return self.webot

    class Meta:
        ordering = ["id"]

如果改爲-id就是逆序,接着python manage.py makemigrations進行代碼移植

Migrations for 'moments':               
moments\migrations\0001_initial.py                                                                                        
- Create model Wechatuser                                                                                               
- Create model Status  

這個0001_initial.py就是python版sql語言。

接着python manage.py migrate

10.  ok 接下來我們需要管理數據庫 <DB>爲數據庫名

在<APP>下有個admin.py,我們將自己的表進行“註冊”

admin.site.register(<DB>)

11. 創建超級管理員進行管理

python manage.py createsuperuser 按照提示操作

12. 在views.py文件 

status = <DB>.objects.all()訪問所有數據庫對象

python斷點調試

import pdb

pdb.set_trace() 在作用域內訪問各種變量

 

在html中對某個block,想讓它一個接一個展示(假設傳入的字典名字爲status):

{%for s in status%}

{%endfor%}

{%if status.pics%}

 

登錄模塊

from django.contrib.auth.views import LoginView, LogoutView

    path('',LoginView.as_view(template_name="homepage.html")),

    path('exit',LogoutView.as_view(next_page="/")),

 

對於登錄模塊,<form>加入method=“post”

爲了防止跨域攻擊,在下面加入一句話 {%csrf_token%}

爲了避免退出登錄後還能進入原來界面,from django.contrib.auth.decorators import login_required
在views.py相關函數前加入一句@login_required

def submit_post(request):
    user= Wechatuser.objects.get(user=request.user)
    text= request.POST.get("text")
    upload_file = request.FILES.get("pics")
#    import pdb; pdb.set_trace()
    if upload_file:
        name = upload_file.name
        with open("./moments/static/image/{}".format(name),'wb') as handler:
            for chunk in upload_file.chunks():
                handler.write(chunk)
    else:
        name = ""
    if text:
        status = Status(user=user,webot=text,pics=name)
        status.save()
        return redirect("/status")
    return render(request,"my_post.html")

上述代碼能夠獲取用戶在頁面POST的信息,並加入到status網頁中。

 

實現用戶註冊功能

1. 創建用戶 user =  User(name="",email="")

user.set_password("")

user.save()

User.objects.create(user="",email="")

json.dump()

json.load()

2. 在views.py寫register函數

注意拋出錯誤,返回是以JSON的形式 Javascript Object Notation專門針對JS對象。類似字典

def register(request):
    username,email,password = [request.POST.get(k) for k in ("username","email","password")]
    try:
        user = User(username=username, email=email)
        user.set_password(password)
        user.save()
        Wechatuser.objects.create(user=user)
    except Exception as err:
        message = str(err)
        result = False
    else:
        message = "Register OK"
        result = True
        
    return JsonResponse({"message":message,"result":result})

3.自己寫post測試

import requests

data = {
        "username":"Hacker",
        "password":"YOUAREHACKED",
        "email":"[email protected]",
        "csrfmiddlewaretoken":"vnb6x6Py5aq0gqbfJKf3GG1qLafpQ6rgiRYHA5cYP192jNFADXPwft0QLCUccMgw",
        }
cookies= {"csrftoken":"p0WgAJyd9B5EbKkLlPu56cSPp8P1ZU0NcuJRDIVDTsOGe7O6f24yFZRfpAuOlAP3",
        }
r = requests.post("http://localhost/register",data=data,cookies = cookies)
print(r.text)

4.jQuery:

$("#register_name")獲取用戶輸入 其中#表示一個選擇器,id="register_name",不帶#, 如果要選擇一個類class就是$(".register_name")

表示標籤,如input。 如果我們想獲取標籤input中的name屬性

#("input[name]").val()即可

使用ajax異步請求獲得客戶的註冊信息:

                 <script>
                    function register(){
                    $.ajax({
                    url:"/register",
                    type:"post",
                    data:{
                        "username":$("#register_name").val(),
                        "email":$("#register_email").val(),
                        "password":$("#register_password").val(),
                        "csrfmiddlewaretoken":$("input[name='csrfmiddlewaretoken']").val(),
                        },
                    success: function(response){
                    
                    alert(response["message"])};
                    location.reload();
                    
                    })
                    }
                    $("#register_submit").click(function(){
                        register()
                    })
                        
                </script>

注意的是,爲了安全性,需要進行csrf校驗,在表單下如果有{% csrf_token%} 則會自動轉換爲input標籤,我們通過$("input[name=csrfmiddlewaretoken]")就可以查到它。可以F12去在網頁上找到。 一般地,自己寫個py,還需要cookies,在Chrome的application標籤可以找到。  這裏的location.reload()保證客戶刷新網頁之後,之前填寫表單會刷新。若註冊成功則會彈出對話框。

button標籤改爲a標籤,移去type="submit"屬性

 

接下來實現用戶可以更改自己的名片功能.

1.首先要做的就是利用jQuery實現我們想要的功能: 調用replaceWith方法$("#name").replaceWith("<input>")還需要添加style屬性,我們可以利用attr("style")來獲取原來的樣式,把字體改成灰色即可。同時 id , placeholder, value均可以更改。可以用.html()獲取value,注意,標籤<>內的賦值是用單引號,而單引號內必須爲字符串,所以如果用了jQuery函數,必須加雙引號來變爲字符串。同python可以用“+”實現字符串拼接。有一些使用split來實現分割,trim去除前後空格。

 

 

實現簡易評論功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章