django学习(1)

django学习

前端效果不想写,可以去jq22.com下载。

若数据库使用MySQL,在setting同级目录下__init__文件中添加:

import pymysql

pymysql.install_as_MySQLdb()

一、获取django

安装django:

    pip install django

创建一个django项目:

    django-admin startproject [your project Name]

在创建的项目目录下创建自己的APP应用:

    python manage.py startapp [your app Name]

运行项目:

    python manage.py runserver

当运行其他人的项目或者迁移项目时,迁移数据库:

    python manage.py makemigrations
    python manage.py migrate

出现下图即为运行成功:
运行成功结果图

二、django项目目录介绍

如下图所示:

项目目录结构图

settings.py保存django的配置信息,列如数据库和HTML的存放目录(见下图):
设置数据库图

可以从注释中的链接查看官方文档,获取写法。

html目录图

DIRS便是存放html的目录。

urls设置路由,当浏览器访问时,首先调用此文件,按照请求路径进行匹配。


以上是django的主目录,下面创建一个应用,即真正需要我们实现业务逻辑的位置

app目录结构

app目录结构

migrations是存放关于生成数据库表的目录,在执行

    python manage.py makemigrations
    python manage.py migrate

时自动生成。

views.py写业务逻辑。

models.py模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。

admin是django自带的用来让你进行数据库管理的web app.提供了很多定制化功能,你甚至可以用它来进行公司内部的内容管理。


HttpResponse

1.下载

def download(request):
    f = open(r"path")
    response = HttpRespose(f.read(), content_type = "(此处根据你的文件格式查询MIME)")

    response['Content-Disposition'] = 'attachment;filename="NAME.后缀"'
    return response

2.重定向

HttpResponseRedirect(‘路径’)


views中
类方式

from django.views import View

class Demo(View):
    def get(self, request):
        return HttpResponse('babababa...')


在urls中,path(‘path’, views.mothed) mothod只能是方法,直接写Demo会报错,应该path(‘path’, views.mclass.as_view())

settings.py介绍

数据库连接

数据库设置必须配置默认数据库;也可以指定任意数量的附加数据库。

DATABASES = {
    'default': { #默认数据库
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

当连接到其他数据库后端(如MariaDB, MySQL, Oracle, or PostgreSQL)时,将需要额外的连接参数。有关如何指定其他数据库类型,请参阅下面的 ENGINE设置。本示例用于PostgreSQL:

DATABASES = {
       'default': {
        'ENGINE': 'django.db.backends.postgresql', #根据不同数据库更改
        'NAME': 'mydatabase', #连接到的创建的数据库名字
        'USER': 'mydatabaseuser', #数据库登录名
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1', #数据库地址
        'PORT': '5432', #数据库端口
    }
}

ENGINE

  • ‘django.db.backends.postgresql’
  • ‘django.db.backends.mysql’
  • ‘django.db.backends.sqlite3’
  • ‘django.db.backends.oracle’

静态文件

在django中,静态文件为CSS、JS、Image。在srttings.py文件中,设置属性为:

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


STATIC_URL = '/static'  #请求url路径
STATICFILES_DIRS = [BASE_ DIR / 'path',] #静态文件在项目中的路径

views.py

from django.shortcuts import render,HttpResponse

def OurMothedName(request):
    return HttpResponse("Your String")

def render_Test(request): #必须要有request参数
    return render(request, 'our_html.html')

HttpResponse一般用来直接返回字符串,当然也可以返回类似这样:"<h1>html字符串</h1>",浏览器会自动解析。

render则用来返回一个html文件。

request参数

包括了一些请求信息。常用属性:

  • mothed
  • POST

request.mothed是一个字符串,表示浏览器请求方式,一般有:

request.mothed

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • PATCH
  • OPTIONS
  • TRACE

request.POST是一个字典,可以用浏览器传过来的参数名获取:

    request.POST['username']

models.py

    from django.db import models

    class User_Table(models.Model): #必须继承models.Model
        uesrname = models.CharField(max_length = 64)
        password = models.CharField(max_length = 64)

一个类就代表了一张表,里面的属性代表了字段,像username便是创建了一个最大长度为64的字符字段。

现在数据库还是没有的,需要执行数据库迁移命令:

    python manage.py makemigrations
    python manage.py migrate

执行完成后,数据库就改完了。

Django模板系统

在上面settings.py中曾提到模板属性作用,这里的模板也是与html相关联的。有两种特殊符号{{ }}和{% %},如果学过jsp可能更能体会到相似。

{{ }}表示变量,在模板渲染时替换成值。{% %}表示逻辑相关的操作。点 . 用来获取对象属性。

比如在html中:

<body>
    {{ var_name }}
</body>

在渲染时便可替换:

    def RenderHtml(request):
        return render(request, 'html.html', {'var_name' : value,})

若变量为一个列表,可以在在HTML中直接“变量名.索引”:
var_name.0 等价于在python中var_name[0],若为字典,则“变量名.key”即可。 html中 . 后面可以加方法,不加括号,既然不能加括号,那么便无法传递参数,所以自定义方法不能加参数。 若字段冲突,.会按照:“字典关键字查询、属性方法名查询、按数字索引查询”这种顺序查询。

过滤器

{{ 变量名|filter_name:参数}}
“:”左右不加空格。

自定义过滤器
  1. 在app下创建一个名为templatetags包(包的名字不能错)
  2. 创建一个python文件,文件名自定义(mytags.py)
  3. 在python文件中写:
from django import  template

register = template.Library() #register名字不能错
  1. 写函数+装饰器
    函数只能有一个或两个参数,第一个表示变量,第二个表示给过滤器的参数。
@register.filter
def demo_mothed(value, arg):
    return "随便"

在模板中使用:

{% load mytags %}

{{ var_name|demo_mothed:par }}
母板和继承

可以继承一个html。

{% entends 'extend.html' %}
<!--'extend.html'带引号,否则会被当成一个变量,若作为变量使用,可以在后台控制页面继承某个母版 -->
{% block block_name %}
     <!-- 这里写自己的代码 -->
{% endblock %}


<% include  'content.html'%>
<!-- 包含过来 -->

母板包含页面公共部分,定义多个block块供子页面覆盖。

Cookie登录后保存登录状态

cookie保存在本地的一组键值对。

def login(request):
    if request.mothed == 'POST':
        user = request.POST['user']
        pwd = request.POST['password']
        if user == 'bla' and pwd == 'lalala':
            ret = redirect('direct.html')
            ret.set_cookie('key', 'value')

            return ret
    
    return render('login.html ')

装饰器

DRF,restful理念框架

新建一个serialzers.py

from rest_framework import serializers

from .models import modelName

class modelNameSerializer(serializers.ModelSerializer):
    class meta:
        model = modelName #指定序列化从哪个模型映射字段
        fileds = '__all__' #映射哪些字段

在view.py中

    from rest_framework.viewsets import ModelViewSet

    from .serialzers import modelNameSerializer
    class Mclzz(ModelViewSet):
        #指定查询集
        queryset = modelName.objects.all()

        #指定序列化器
        serializer_class = modelNameSerializer

在urls.py中,原本的urlpatterns都不用再写。

from rest_framework.routers import DefultRouter
from . import views

urlpatterns = []

router = DefultRouter()
router.register(r'', views.Mclzz)
urlpatterns += router.urls

Serializer构造方法:Serializer(instance=None,data=empty, **kwarg)

将模型传入,便是将模型转换为字典:Serializer(modelClassIntance)。

将json数据传入,便是反序列化,即可将json转换为模型。
序列化器中字段个数可以与models中不同但是存在字段名称必须相同。

反序列化

反序列化之前,需要调用is_valid()校验,若正确,则返回True,errors:返回字典,包含错误信息。验证成功,validated_data返回数据。

当然,在调用校验时指定参数is_valid(raise_exception=True),便会直接抛出异常并打印错误信息。

校验完成后,调用save()方法。会执行序列化器的create或丿update方法。

额外追加校验逻辑

在序列化器类中中定义方法validate_ + ‘想额外校验的字段名’ :

    from rest_framework import serializers

    class clzz(serializers.Serializer):
        name = serializers.CharField(max_length = 64)
        
        #validate_字段名 
        def validate_name(self, value):
            #value是值
            if 'ss' not in value.lower():
                raise serializers.ValidationError("ss不存在")
            return value

        #联合校验
        def validate(self, attrs):
            #attrs是前端传过来的字典

            return attrs

        #也可以在定义字段中指定validator参数

        password = CharFeild(max_length = 32, validator = [check_function])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值