成为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去除前后空格。

 

 

实现简易评论功能

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