• Django内置函数详解Httprequest详解(模拟搜索/模拟用户登陆/模拟上传文件功能)


    Django内置函数详解Httprequest详解(模拟搜索/模拟用户登陆/模拟上传文件/下载文件)

    1.0 Djiango内置函数说明

    函数名称
    httpHttoResponseHttoResponse对象
    httpStreamingHttpResponse响应可迭代对象
    httpFileResponse下载文件
    httpjsonResponse返回json
    shortcutsrender响应HttoResponse对象,一个快捷函数
    viewsgeneric view类视图继承的类
    viewsdecorators csrf取消某视图csrf防护
    contribadmin内建管理后台
    contribauthlogin 登陆
    contribauthlogout 退出
    contribauthauthenticate 用户信息认证
    contribauthdecorators login_required 登陆认证装饰器
    contribauthmodels user 获取登陆用户信息
    contribauthmodels Baseusermanager,abstractbaseuser 获取登陆用户信息
    confsettings导入配置文件
    dbconnection连接数据库

    2.0 HTTP请求流程

    在这里插入图片描述
    HttoResponse含义
    ·djiango会建立一个包含请求源数据的Httprequest对象,当djiango加载对应视图Httprequest对象将作为函数的第一个参数request,每个视图返回一个HttoResponse对象·
    在这里插入图片描述

    Httprequest对象:常用的方法
    方法描述
    request.get_host()服务器主机地址和端口
    request.get_port()服务器端口
    request.get_full_path()请求页面完整路径和查询参数
    request.get_raw_uri请求页面url所有信息,包含主机名,路径参数
    测试
    在这里插入图片描述
    HttpRequest对象:接收URL参数

    在这里插入图片描述
    打印第一个参数和第二个参数

    print(request.GET["a"])
    print(request.GET["b"])
    
    • 1
    • 2
    HttpRequest对象:请求事例
    1.表单GET提交,例如搜索页面

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.表单POST提交,例如登陆页面

    实现如图所示的功能
    在这里插入图片描述

    2.1 配置路由

     re_path('^login/',views.login,name='login')
    
    • 1

    在这里插入图片描述
    2.2 配置视图
    在这里插入图片描述

    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
    
    • 1
    • 2
    • 3

    2.3 配置登陆页面login.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆title>
    head>
    <body>
    <h1>欢迎访问devops系统h1>
    <form action="">
        用户名 :<input type="text" name="username"><br>
        密码   :  <input type="text" name="password"><br>
        <button type="submit">登陆button>
    form>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    请求测试

    http://127.0.0.1:8000/login/
    
    • 1

    2.4 实现密码登陆的逻辑

    GET  明文,不适合传输敏感数据,例如文章id,数据表格id,搜索功能
    POST 在http请求正文里,例如用户密码,上传文件
    
    • 1
    • 2

    2.4.1 导入跳转模块redirect,修改视图,模拟密码登陆的请求场景并返回相应的结果

    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
        elif request.method == 'POST':
            print(request.POST)
            username = request.POST.get('username')
            password = request.POST.get('password')
            #查询数据库用户名和密码是否正确,当正确时跳转首页
            if username == 'zhangfan' and password == '123456':
                #跳转首页
                return  redirect('/')
            else:
                msg = '用户名或者密码错误!'
                #当密码错误时返回错误信息到前端首页
            return render(request, 'login.html',{'msg':msg})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.4.2 修改前端html页面

    <span style="color: red;">{{ msg }}span>
    
    • 1

    在这里插入图片描述
    最终实现密码正确能跳转到首页 ,密码错误前端返回错误信息
    在这里插入图片描述
    在这里插入图片描述

    3 实现上传图片,例如修改头像等

    3.1 创建一个上传的路由
    在这里插入图片描述

       re_path('^user_upload/$', views.user_upload,name='user_upload')
    
    • 1

    3.2 编写视图 写一个上传user_upload的函数

    def user_upload(request):
        if request.method == "GET":
            return render(request, 'upload.html')
        elif request.method == "POST":
            print(request.FILES)
            obj = request.FILES.get('touxiang') #获取上传过来的头像
            print(type(obj),obj.name)
            import os
            file_path = os.path.join('upload',obj.name)  #定义上传文件的路径
            with open(file_path,'wb') as f:
                for i in obj.chunks(): #循环接收二进制文件块
                    f.write(i)   #写入到本地
            msg = "上传成功!"
            return render(request, 'upload.html',{'msg':msg})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    同级创建一个upload的文件目录
    在这里插入图片描述

    3.3 编写upload.html模版

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>上传文件title>
    head>
    <body>
    <form action="{% url 'user_upload' %}" method="post", enctype="multipart/form-data">
        <input type="file", name="touxiang">
        <button type="submit">提交button>
        <br>
        <span style="color: red;">{{ msg }}span>
    form>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3.4 上传一个图片测试测试
    在这里插入图片描述
    在这里插入图片描述
    在本地upload目录下会显示刚才上传的图片,说明上传功能实现

    4 下载文件

    编写 urls.py路由文件

    re_path('^download/$',views.download,name='download'),
    re_path('^down_file/(.*)$',views.down_file, name='down_file')
    
    • 1
    • 2

    4.1 获取下载文件列表

    def download(request):
        print(os.getcwd())
        file_list = os.listdir('upload')
        print(file_list)
        return render(request,"download.html",{'file_list': file_list})
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 编写下载文件函数

    def down_file(request,filename):
        file_path = os.path.join('upload',filename) #down_file/mm.jpg
        response = StreamingHttpResponse(open(file_path, 'rb'))   #打开二进制文件
        response['Content-Type'] = 'application/octe-stream'
        response['Content-Disposition'] = 'attachment; filename=%s' % (os.path.basename(file_path)) #指定下载的文件名
        return response
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.3 编写下载文件模版
    download.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>下载文件列表title>
    head>
    <body>
    {% for i in file_list %}
        <a  href="{% url 'down_file' i  %}">{{ i }}a>
        <br>
        {# url结果: 拼接 :/down_file/m.jpg #}
    {% endfor %}
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.4 验证 下载结果

    http://127.0.0.1:8000/download/
    
    • 1

    在这里插入图片描述
    点击任意列表实现文件图片的下载

    request.GET应用场景:
    1.获取客户端信息,请求页面的情况
    2.接收客户端上传的数据和文件
    3.根据客户端特定信息作相应处理,例如根据请求方法在这里插入图片描述

  • 相关阅读:
    卡塔尔.巴林:海外媒体投放-宣发.发稿效果显著提高
    FFmpeg源代码简单分析-其他-libavdevice的avdevice_register_all()
    SM项目 - Online Music Player(在线音乐播放器)- 项目部署
    【无标题】
    【IDEA】idea配置
    LeetCode-882. Reachable Nodes In Subdivided Graph [C++][Java]
    【C++11】QT开发中常用的C++11特性
    17、Mybatis获取参数值的情况3(若mapper接口方法的参数为多个时,可以手动将这些参数放入map中存储)
    Golang | Leetcode Golang题解之第40题组合总和II
    酷开会员丨酷开系统让居家K歌变得更简单!
  • 原文地址:https://blog.csdn.net/weixin_43546282/article/details/127379287