Django框架学习记录(2)

一、运行Django

1、保证app已注册

前面已经创建了app了,每个app都要注册

 app1的apps.py中有个类,然后在项目里面的settings.py里面找到下方的代码,添加到最下面一行

'app1.apps.App1Config'就可以了,app1代表创建的app名称

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1.apps.App1Config',
]

2、编写url和视图函数之间的对应关系

编写一个简单的视图函数,找到urls.py,找到urlpatterns,加一个path,第一行给他注释掉

项目的路由统一都写在这里

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('index/', views.index),
]

index/代表路径,访问这个路径就会调用后面的views.py里面的index函数,现在views.py里面是没有这个函数的,下一步去views.py里面创建index函数

由于返回了一个HttpResponse方法,所以要导入一个HttpResponse模块,这里定义了视图函数index,urls.py文件要调用该函数就要引用view文件

启动项目后,用户访问index/路径后就会返回一个字符串“你好,Django!” 

3、启动Django项目

通过命令行启动

python manage.py runserver

也可以带ip地址和端口启动项目:python manage.py runserver 0.0.0.0:9000

 如果有如下报错

 执行命令:python manage.py migrate

 10013错误代码是表示端口冲突,换个9000或其他端口启动然后就可以了

 

正常后登录是这样

 会提醒你写了这个url(index/),如果写了其他url也会在这里列出来,后面加上你写的url就可以访问了

 4、解析路由参数

上面写的路由规则是固定的,下面介绍动态路由

1)编写带url参数的路由

 

 运行结果

 2)介绍路由参数

url的参数类型

类型说明
str任意非空字符串,不包含“/”,默认类型
int匹配0和正整数
slug匹配任何ASCII字符、连接符和下划线
uuid匹配一个uuid格式的字符串,该对象必须包含“-”,所有字母必须小写。如00000000-abcs-3cii-1234-000000123412

5、视图函数的底层原理

Django中的视图是MTV模式中的View层,用户处理客户端的请求并生成响应数据,在视图中使用函数处理请求的方式,被称为视图函数,当浏览器请求一个页面是,Django先创建HttpRequest对象,该对象中包含请求的元数据,然后加载响应视图,将这个HttpRequest对象作为第一个参数传递给视图函数,视图函数会返回一个HttpResponse对象。

HttpRequest对象主要包含如下

属性/方法含义
path字符串,标识请求页面的路径,不包含域名
method字符串,标识页面的请求方法,常用值包含“GET”和“POST”,必须大写
encoding字符串,标识提交的数据的编码方式,一般默认UTF-8
GET字典类型,包含GET请求方法中的所有参数
POST字典类型,包含POST请求方法中的所有参数
FILES字典类型,包含上传文件的信息
COOKIES字典类型,包含所有的cookies对象
META字典类型,包含所有的HPPT头部信息
session字典类型,当前会话
user当前登录的用户

views.py文件中

def test(request):
    print(request.get_host())           # 域名+端口
    print(request.get_raw_uri())        # 全部路径
    print(request.path)                 # 文件路径,不含参数
    print(request.get_full_path())      # 文件路径,包含参数
    print(request.method)               # 获取请求的HTTP方式
    print(request.GET)                  # 获取GET请求的参数
    print(request.META["REMOTE_ADDR"])  # 客户端ip地址
    print(request.GET.get('username'))  # 获取get参数
    return HttpResponse("")

urls.py文件中

 控制台输出如下所示

HttpResponse对象的常见属性

属性含义
content返回的内容
status_code返回的HTTP状态码
content-type返回数据的MIME类型,默认为text/html

常用的状态码

状态码含义
200成功
301永久重定向
302临时重定向
404url不存在
500内部服务器错误
502网关错误
503服务不可用

修改一下test函数内容

def test(request):
    response = HttpResponse()
    response.write("Hello django")
    response.write("<br>")                    # 换行
    response.write(response.content)          # 返回的内容
    response.write("<br>")
    response.write(response['Content-type'])  # 返回的数据MIME类型
    response.write("<br>")
    response.write(response.status_code)      # 返回的状态码
    return response

二、模板和静态文件

Django提供了模板技术用于编写html代码,之后可以通过视图技术渲染模板将最终生成的html代码返回给客户端浏览器显示,Django模板技术作为MTV模式中的T(template),主要用于页面的展现,实现了业务逻辑和内容显示的分离,通常一个模板可以供多个视图使用

静态部分,如html、css、JavaScript

动态部分,如Django的模板语言DTL

通过HttpRequest对象和HttpResponse对象可以处理基本的数据请求和并返回响应数据,但是这种方式很烦琐,Django将这些底层的操作过程全部进行了封装,提供了几个简单的函数供我们使用。

render()函数实现页面渲染,格式为

from django.shortcuts import render

# request:传递给视图函数的所有请求,就是视图函数的参数request
# template:渲染的模板文件,一般放在templates目录下
# content:数据格式为字典类型,保存要传递到HTML文件中的变量
# content_type:默认text/html
# status:响应的状态代码,默认200
# using:设置模板引擎,用于解析模板文件
render(requeset, template_name, content=None, content_type=None, 
status=None, using=None)

redirect()函数实现页面重定向

1、templates目录

1)通过urls文件里的路由配置调用视图函数,视图函数调用html文件

这个目录没有的话可以创建一个,放在应用(app)的根目录下面,用来存放html文件

 新建一个html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/login/">
      <input type="text" name="user" placeholder="用户名">
      <br>
      <input type="password" name="pwd" placeholder="密码">
        <span style="color:red">{{ error_msg }}</span>
      <br>
      <input type="submit" value="提交">
    </form>
</body>
</html>

 和之前一样,分别加上url和视图函数

 使用了render()函数渲染页面,然后浏览器访问页面

2)通过在html文件中设置占位符获取变量

a)模板变量的表示:模板变量使用{{ 变量名 }}来表示,注意变量名前后都有个空格,变量名由字母、数字和下划线组成,中间不能有空格等其他字符

b)模板变量还可以是列表、字典及类对象

c)模板标签,模板标签需要使用标签限定符{% %}进行包裹,常见的标签有

模板标签描述
{% if %} {% endif %}条件判断模板标签
{% for %} {% endfor %}循环模板标签
{% url %}

路由配置的地址标签

{% extends xx %}模板继承标签,从xx模板继承
{% load %}加载相关内容,如{% load static %}
{% static %}静态资源
{% block %} {% endblock %}一组占位符标签,需要重写模板
{% csrf_token %}用来防护跨站请求伪造攻击
{% include 页面 %}包含一个html页面

d)模板过滤器

过滤器描述
{{ name|safe }}关闭html标签和JavaScript脚本的语法标签的自动转义功能。
{{ name|length }}获取模板变量的长度
{{ name|default:"默认值" }}当变量的值为False时,显示默认值
{{ name|date:"Y-m-d  G:i:s" }}格式化输出时间日期变量
{{ name|upper }}将字符转为大写
{{ name|lower }}将字符转为小写
{{ name|slice:"2:4" }}以切片方式获取字符串的一部分

新建一个文件students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板语法学习</title>
</head>
<body>
    <h1>传递变量</h1>
    <div>{{ s1 }}</div><!-- 传递视图函数中s1的值 -->
    <div>{{ s2 }}</div><!-- 传递视图函数中s2的值 -->
    <br>
    <div>{{ s2.0 }}</div><!-- 传递视图函数中s2列表中的第一个值,通过“.”后面加索引访问 -->
    <div>{{ s2.1 }}</div><!-- 传递视图函数中s2列表中的第二个值,通过“.”后面加索引访问 -->
    <br>
    <div>
        {% for i in s2 %}<!-- 循环获取s2列表中的每个值 -->
            <div>{{ i }}</div>
        {% endfor %}<!-- 循环必须有结束 -->
    </div>
    <br>
    <div>
        <div>{{ s3 }}</div><!-- 直接获取字典 -->
        <div>{{ s3.name }}</div><!-- 根据字典的键获取对应的值 -->
        <div>{{ s3.score }}</div>
        <div>{{ s3.sex }}</div>
    </div>
    <ul>
    {% for i in s3.keys %}<!-- 循环获取s3中的键 -->
        <li>{{ i }}</li>
    {% endfor %}
    </ul>
    <hr/>
    <ul>
    {% for i in s3.values %}<!-- 循环获取s3中的值 -->
        <li>{{ i }}</li>
    {% endfor %}
    </ul>
    <hr/>
    <ul>
    {% for i,j in s3.items %}<!-- 循环获取s3中的键值 -->
        <li>{{ i }} = {{ j }}</li>
    {% endfor %}
    </ul>
    <hr/>
</body>
</html>

views.py文件

def students(request):
    name = "张三"
    role = ["班长", "学习委员", "体育委员"]
    report_card = {"name": "张三", "score": "80", "sex": "男"}
    return render(request, "students.html", {"s1": name, "s2": role, "s3": report_card})

配置路由后访问

 访问列表或者字典里面的值都是通过“.”加索引或者键名去访问的,如果是列表里面还有字典,继续“.”加索引或者键名去钻取访问

 2、static目录

一般img、css、js这些静态文件都会存放在该目录下,如果没有就自己创建一个,和templates一样

 新建一个html文件

{% load static %}
<!-- Django模板语法,引用静态文件的时候都需要加上上面这行代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>引用图片</title>
</head>
<body>
    <h1>引用图片</h1>
    <img src="{% static 'img/02.png' %}" alt="">
</body>
</html>

 url和视图函数配置好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值