django学习(1)"/>
django学习(1)
django学习
前端效果不想写,可以去jq22下载。
若数据库使用MySQL,在setting同级目录下__init__文件中添加:
import pymysqlpymysql.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 makemigrationspython manage.py migrate
出现下图即为运行成功:
二、django项目目录介绍
如下图所示:
settings.py保存django的配置信息,列如数据库和HTML的存放目录(见下图):
可以从注释中的链接查看官方文档,获取写法。
DIRS便是存放html的目录。
urls设置路由,当浏览器访问时,首先调用此文件,按照请求路径进行匹配。
以上是django的主目录,下面创建一个应用,即真正需要我们实现业务逻辑的位置
migrations是存放关于生成数据库表的目录,在执行
python manage.py makemigrationspython 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 Viewclass 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.parentSTATIC_URL = '/static' #请求url路径
STATICFILES_DIRS = [BASE_ DIR / 'path',] #静态文件在项目中的路径
views.py
from django.shortcuts import render,HttpResponsedef 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 modelsclass User_Table(models.Model): #必须继承models.Modeluesrname = models.CharField(max_length = 64)password = models.CharField(max_length = 64)
一个类就代表了一张表,里面的属性代表了字段,像username便是创建了一个最大长度为64的字符字段。
现在数据库还是没有的,需要执行数据库迁移命令:
python manage.py makemigrationspython 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:参数}}
“:”左右不加空格。
自定义过滤器
- 在app下创建一个名为templatetags包(包的名字不能错)
- 创建一个python文件,文件名自定义(mytags.py)
- 在python文件中写:
from django import templateregister = template.Library() #register名字不能错
- 写函数+装饰器
函数只能有一个或两个参数,第一个表示变量,第二个表示给过滤器的参数。
@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 retreturn render('login.html ')
装饰器
DRF,restful理念框架
新建一个serialzers.py
from rest_framework import serializersfrom .models import modelNameclass modelNameSerializer(serializers.ModelSerializer):class meta:model = modelName #指定序列化从哪个模型映射字段fileds = '__all__' #映射哪些字段
在view.py中
from rest_framework.viewsets import ModelViewSetfrom .serialzers import modelNameSerializerclass Mclzz(ModelViewSet):#指定查询集queryset = modelName.objects.all()#指定序列化器serializer_class = modelNameSerializer
在urls.py中,原本的urlpatterns都不用再写。
from rest_framework.routers import DefultRouter
from . import viewsurlpatterns = []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 serializersclass 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])
更多推荐
django学习(1)
发布评论