django学习笔记(1)

前后端不分离,前后端分离

前后端不分离概念:

  • 前后端不分离,那么前端的看到的效果完全由后端控制,由后端渲染页面后者进行重定向,也就是说后端需要控制前端的展示,前端、后端的耦合度很高。
    在这里插入图片描述

前后端分离的概念:

  • 前后端分离的应用模式中,后端只返回前端需要的数据,不在渲染html页面,也不在控制前端的效果,至于前端看到什么样的效果,取决于前端。
    在这里插入图片描述
django中的模块
  • 模型model:数据层,处理与数据相关的所有事物
  • 视图view: 视图层,用来处理用户发出的请求
  • 模板template:模板,通过视图函数渲染html模板,得到动态的前端页面
  • 路由url:网站的入口,关联到对应的视图函数,访问网址就对应一个函数
  • 表单forms:表单,用在浏览器输入数据提交,并对这些数据进行验证
  • 后台admin:django自带一个管理后台,对你提交的数据进行管理
  • 配置settings:django的设置,配置文件
django中的settings配置文件的说明
  • ALLOWED_HOSTS = ["*"] :用来限制能够访问项目的ip地址,如果设置为“*”的话,就意味着所有的ip地址都能够访问,其主要就是为了防止黑客攻击的。
  • INSTALLED_APPS = ["django.contrib.admin",]:凡是我们自己定义的应用,都需要进行安装,如果是django2.0版本以上的,可以直接用app的名字如INSTALLED_APPS=["app”],如果是django1.0版本的使用INSTALLED_APPS=["users.apps.UsersConfig'”]
  • ROOT_URLCONF = 'django_learning.urls':设置根路由的位置
  • WSGI_APPLICATION = 'django_learning.wsgi.application':指定wsgi应用的位置
  • AUTH_PASSWORD_VALIDATORS :用来做密码验证,比如我们通过python manager createsuperuser时设置的密码。
virtualenv
  • virtualenv是一个Python的虚拟环境库,通过它可以防止各个项目之间因为Python版本不同或第三方版本不同引起冲突,每个虚拟环境都是独立,干净的。
  • 创建虚拟环境: virtualenv -p python3 虚拟环境名称
  • 启动虚拟环境:在 windows上使用env名称/Scripts/activate进入虚拟环境, 在linux和mac上使用. 虚拟环境名称/bin/activate进入虚拟环境
  • 退出虚拟环境:deactivate
django的基础命令
  • django-admin startproject 项目名:创建一个django项目
  • python manage.py startapp 应用名 :创建一个应用
  • python manage.py shell : 进入调试代码的调试模式
  • python manage.py makemigrations :数据库创建更改文件
  • python manage.py migrate: 同步到数据库进行更新
  • python manage.py flush : 清空数据库
  • python manage.py runserver 0.0.0.0:8000: 启动开发服务器,因为开发服务器是单进程的,承受不了高并发
  • python manage.py + 回车 可以查看更多命令
路由常用方法,变量与views的绑定

path函数:path(uri, 视图函数, name=“路由名称”)将视图函数与ur l进行绑定,注意这个别名可以在重定向和模板定义的时候直接用别名替代

from django.urls import path, include
from django.contrib import admin
path("admin/", admin.site.urls) # 设置admin的url,admin/代表uri的地址,后面的/代表路径分隔符,admin.site.urls是url对应的视图函数
path("", include("app.urls")  # include的是将应用中的urls全部包含进来

# 上面的写法也可以使用下面的代替
from app import urls as app_urls
path("", include(app_urls)   # 注意这种方法需要将urls模块起个别名,因为不同应用都有url模块

示例:
在这里插入图片描述

path函数与url函数的区别:

在Django2.0其中一个新特性为:简化Url路由的语法。在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:

# 原来的url
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

# Django2.0新语法
path('articles/<int:year>/', views.year_archive)  # 新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。

# 在Django1.x里,我们需要对year做类型转换:
def year_archive(request, year):
    year = int(year)
  • URL参数捕获,在新的语法里,url字符串有以下规则:
    • 在url里使用尖括号“<>”来捕获值
    • 尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
    • url不需要以斜杠开头。
      代码示例:

from django.urls import path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

匹配示例:

  1. /articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
  2. /articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
  3. /articles/2003:没有匹配到规则,原因是所有的规则都是以斜杠结尾
  4. /articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。

默认Path converter, Django2.0自带的PathConveter包括:

  1. str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
  2. int:匹配0及正整数。
  3. slug:匹配字母、数字以及横杠、下划线组成的字符串。
  4. uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  5. path:匹配任何非空字符串,包含了路径分隔符(/)

示例:
在这里插入图片描述在这里插入图片描述

视图的基本写法
from django.http import HttpResponse

def index(request):
	return HttpResponse("hello django2!!!")
视图读取参数
  • url以查询字符串的方式传参,使用request.GET.get("name", default)的形式获取参数值
  • url以路径传参,使用路径转换器来进行获取参数,在django1.0版本的时候只能通过正则表达式来获取参数。
request对象的方法
  • request.GET:获取url中的查询字符串的数据
  • request.POST: 获取表单提交的数据
  • request.path:获取请求的路径
  • request.method:获取请求的方法get or post
  • request.COOKIES:获取请求过来的cookies
  • request.user:获取请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
  • request.session:一个既可读又可写的类似字典的对象,表示当前会话
  • request.META:一个标准的Python字典,包含所有的HTTP首部。具体的头部信息取决于客户端和服务器
视图函数的常用的返回对戏那个
  • HttpResponse对象,可以直接返回一些字符窜
  • render: 将数据在模板中渲染并显示,使用方式为return render(request, template_path, {k:v})字典中key与value就是要向前端渲染出的数据。
  • JsonResponse返回一个json类型,通常用于与前端进行ajax交互
jinja2的模板语法
语法(内置标签)说明
{% for %} {% endfor %}遍历输出的内容
{% if %} {% elif %} {% end if %}对变量进行条件判断
**{% url name args %} **引用路由配置名
{% load %} 比如:{% load static %}加载django的标签库
{% static static_path %}读取静态资源
{% extends base_template %}模板继承
{% block data %} {% endblock %}重写父模板的代码
{% csrf_token %}跨域的密钥
for标签中的语法
变量说明
forloop.counter从1开始计算当前索引
forloop.counter0从0开始计算获取当前索引
forloop.revcounter索引从最大数递减到1
forloop.revcounter0索引从最大数递减到0
forloop.first当前元素是否是第一个
forloop.last当前元素是否是最后一个
empty为空的情况

循环举例:

<!--本例中的range_list=range(10)-->
<ul>
    {% for i in range_list %}
    {% if not forloop.first and not forloop.last %}
    <li> 第{{i}}次循环:{{i}}-&#45;&#45;forloop.counter:{{forloop.counter}}-&#45;&#45;forloop.counter0:{{forloop.counter0}}-&#45;&#45;forloop.revcounter0:{{forloop.revcounter0}}-&#45;&#45;forloop.revcounter:{{forloop.revcounter}}</li>
    {% elif forloop.first or forloop.last %}
    <li>{{i}}-&#45;&#45;forloop.counter:{{forloop.counter}}-&#45;&#45;forloop.counter0:{{forloop.counter0}}-&#45;&#45;forloop.revcounter0:{{forloop.revcounter0}}-&#45;&#45;forloop.revcounter:{{forloop.revcounter}}</li>

    {% endif %}
    <!--如果range_list为空的话,那么就会走下面这个逻辑,  -->
    {% empty %}
    is empty  
    {% endfor %}</ul>

浏览器中的显示效果:
在这里插入图片描述
模板中引用某个路由的方式:

<!--这样在模板中就可以得到name="index"的路径(path("<str:name>/<int:age>,视图函数,name="index")),并且提供参数为"zhangsan"和30-->
<!--如果name="index"路径为"127.0.0.1:8000/lisi/20, 那么在这里得到的herf属性就是"127.0.0.1:8000/zhangsan/30-->
<a href="{% url 'index' 'zhengwei' 30 %}">redirect</a>

模板中加载静态资源:

<!--在模板中引入css文件-->
{% load static %}
<link rel="stylesheet" href="{% static 'hellowrold.css' %}">

模板继承的方式

<!--继承模板-->
{% extends "base.html" %}
<!--给模板挖坑-->
{% block name %}
{% endblock %}

静态文件的配置
  • 在项目根目录创建“static" 与 ”templates“ 文件夹同级
  • 在配置文件settings中添加STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)注意这是一个元组
  • 静态文件的种类有:css文件,js文件,图片
django自带的模板过滤器以及如何自定义模板过滤器
  • 自定义模板过滤器的方法:
    1、在项目的应用下创建templatetags包
    2、将app.templatetags写入settings中的InstallApp中注册
    3、在文件夹下创建myfilter.py文件
    4、在myfilter.py文件中定义如下内容
    在这里插入图片描述

  • django自带过滤器说明:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

django2.0中如何配置jinja2模板引擎

1、安装Jinja2扩展包:pip install Jinja2
2、在django的配置文件settings中配置Jinja2模板引擎


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',  # jinja2模板引擎
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  

3、补充Jinja2模板引擎环境
3.1.Jinja2创建模板引擎环境配置文件
在这里插入图片描述

3.2.编写Jinja2创建模板引擎环境配置代码

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
 
 
def jinja2_environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env
 

4、在settings文件中补充Jinja2模板引擎环境


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',  # jinja2模板引擎
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # 补充Jinja2模板引擎环境
            'environment': 'utils.jinja2_env.jinja2_environment',
            
        },
    },
]

如果我们想要自定义jinja2的模板过滤器的话,按照下面的步骤:
1、utils下创建文件myfilter.py,内容如下:


def test(value, scale):
	return value * scale

2、在jinja2_env.py中添加如下代码:

from utils import test
env.filters["test"] = test
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值