首页>>后端>>Python->django怎么前端加密(2023年最新分享)

django怎么前端加密(2023年最新分享)

时间:2023-12-12 本站 点击:0

导读:今天首席CTO笔记来给各位分享关于django怎么前端加密的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

Django接受前端数据的几种方法

字符型

字符型的数据相对好获取,前端传递的方法如下:

sendData = {
 "exporttype": exporttype,

"bugids": bugids,

"test": JSON.stringify({"test": "test"})

};

在Django的后端只要使用exporttype = request.GET.get("exporttype")

就能正常的获取到这个数据了。

注意: 在Python2.7中数据是unicode编码的,如果要使用,有时候需要进行转str

结果示例:

Excle type 'unicode'

数组型

获取数组型的数据如果使用获取字符串的数据的方法,打出的结果是None。我们要使用这个方法:

bugids = request.GET.getlist("bugids[]")

这样获取的数据就是数组类型。

注意: 获取的数组中的元素是unicode编码的,在某些时候使用需要转编码

结果示例:

•传递的url

[14/Jul/2016 11:00:41]"GET /testtools/exportbug/?exporttype=Exclebugids%5B%5D=102bugids%5B%5D=101bugids%5B%5D

•获取的数据

[u'102', u'101', u'100', u'99', u'98', u'97', u'96', u'95', u'94', u'93', u'92', u'91', u'90', u'89', u'88', u'87'

字典型

字典型数据其实可以当成字符串数据来处理,获取到对应字符串后使用JSON模块做一下格式化就行了。

对于前端来说,传递字典型的数据就是传递JSON数据,所以使用的方法是:

"test": JSON.stringify({"test": "test"})

结果示例:

{"test":"test"} type 'unicode'

相关源码

•Get方法

Get方法是wsgi里面的一个方法。

def GET(self):

# The WSGI spec says 'QUERY_STRING' may be absent.

raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')

return http.QueryDict(raw_query_string, encoding=self._encoding)

最终返回的是一个http.QueryDict(raw_query_string, encoding=self._encoding)http的原始数据,而QueryDict继承于MultiValueDict ,所以我们直接看MultiValueDict就好了。

•MultiValueDict

其实源码看起来并不难。

def get(self, key, default=None):

"""

Returns the last data value for the passed key. If key doesn't exist

or value is an empty list, then default is returned.

"""

try:

val = self[key]

except KeyError:

return default

if val == []:

return default

return val

def getlist(self, key, default=None):

"""

Returns the list of values for the passed key. If key doesn't exist,

then a default value is returned.

"""

try:

return super(MultiValueDict, self).__getitem__(key)

except KeyError:

if default is None:

return []

return default

def __getitem__(self, key):

"""

Returns the last data value for this key, or [] if it's an empty list;

raises KeyError if not found.

"""

try:

list_ = super(MultiValueDict, self).__getitem__(key)

except KeyError:

raise MultiValueDictKeyError(repr(key))

try:

return list_[-1]

except IndexError:

return []

[Django] 如何在Django中使用前端工具链

Django最大的不足在于其落后的前端工具链。现在前端开发几乎必备的包管理器(例如npm,yarn)以及工程化必备的webpack工具链,Django却不支持。Django开发的工作流中,后端的包管理可以用pip,而前端的包只能手动管理。所以,我最近的工程项目中,已不再使用Django提供的前端模块,仅仅把它当作API服务器。这的确很遗憾,因为Django的template引擎也有一些易用的特性,如此抛弃,真的有点不舍。那么有没有可能结合二者的优点呢?

经过一番探索,网上给出最靠谱的答案就是利用 django-webpack-loader 和 webpack-bundle-tracker 这两个插件。其原理是 webpack-bundle-tracker 能够输出webpack的编译过程以及结果。 django-webpack-loader 插件则是Django和webpack之间的桥梁,利用上面的编译结果,自动加载webpack打包后的静态文件。

需要用webpack生成的静态文件时,就在template上面使用下面一段模板语言,能够自动完成静态文件的注入。

简单的试了试,应该能够达到我想要的效果,明天有时间再研究。

django视图中怎么把从前端获取的user作为全局变量

有时候,我们需要Templates模板页面可以使用一些变量。这些变量我们在views.py响应时没有返回设置的变量。例如,如下代码:

#coding:utf-8

from django.shortcuts import render

def index(request):

context = {}

context['title'] = '测试标题'

return render(request, 'index.html', context)

上面是某个views.py的方法之一。它将渲染index.html模版(Template)页面,并返回context字典。该字典是传入变量信息给前端页面。对应的index.html如下:

 

html

head/head

body

h3{{title}}/h3

p是否登录:{{request.user.is_authenticated}}/p

/body

/html

响应结果除了有title变量值之外,还有是否登录信息。该登录信息来自request变量,问题是上面views.py中返回结果的context中没有写入request变量。而模版也没却有可以获取该变量。

这个当时不是无中生有,我一步一步剖析给大家看。原理讲明白之后,就自然懂得如何设置模版(Templates)的全局变量或者叫默认变量。

render方法是render_to_response方法的简写方式。上面的views.py代码相当于如下:

 

#coding:utf-8

from django.shortcuts import render_to_response

from django.template import RequestContext

def index(request):

context = {}

context['title'] = '测试标题'

return render_to_response('index.html', context, RequestContext(request))

如果去掉render_to_response的第三个参数,即RequestContext(request)部分。

渲染index.html模版页面就无法得到{{request.user.is_authenticated}}的值,即没有传递request变量给前端页面。很明显RequestContext很关键。

有关RequestContext的内容可以从Django官方文档查得。

该类实例化时会解析settings中的Templates设置中的context_processors配置。新建Django项目settings.py文件中默认的Templates设置如下:

 

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [],

'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',

],

},

},

]

大家可发现context_processors有一系列设置,其中根据django.template.context_processors.request的路径找到Django的相关源码。

Django安装在Python的安装目录下Lib/site-packages/目录中,找到django/template/context_processors.py文件,打开可看到request方法:

 

def request(request):

return {'request': request}

该方法返回一个字典,key为request,value为request对象。很明显,render中的request对象就是通过加载settings中的context_processors列表方法得到字典项。

我们也可以采用这种方法,给Django项目设置全局的模版变量。例如,我的Django名称为myproject,在myproject/myproject目录中创建一个contexts.py文件,代码如下:

 

#coding:utf-8

from django.conf import settings

# 得到语言设置

def lang(request):

return {'lang': settings.LANGUAGE_CODE}

该文件的方法需要request参数,最后需要返回一个字典即可。

再打开settings.py文件,在Templates中添加刚才写的方法引用:

 

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [],

'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',

# 自定义模版全局变量(默认变量)

'myproject.contexts.lang',

],

},

},

]

添加模版全局变量之后,我们可以在任意位置渲染模版页面无需再手动写相关代码即可使用该变量。

使用django开发一个比较简单的post接口

先把前置条件说一下

1.首先搭建好django环境 win+r 打开命令提示符 pip install django

3.然后创建一个自己的app

同样在命令提示符 进入刚创建的工程所在路径 输入 python manage.py startapp xxx(这个指你要创建的app名字),创新编辑器可以看到

4.正式开始开发一个post请求

首先设置好参数 在seetings.py文件里如图修改

views.py

最后在templates文件夹下创建一个html文件简单地写一下前端

我这里直接贴自己写的 login.html

code部分算是完成 看一下效果

还可以进入fiddler查看验证,为了比较好查到 我们先打开fiddler后输入用户名 密码后fiddler上 remove all session

可以得到这么一条数据包

username,password的值也和我们输入的一致

到此完成一个简单的post请求开发

求助django 实现前端页面检索功能的代码

设我们的 django 博客应用有如下的文章模型:

blog/models.pyclass Post(models.Model):

# 标题

title = models.CharField(max_length=70)

# 正文

body = models.TextField()

# 其他属性

def __str__(self):

return self.title

先看到第 1 步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html 表单代码大概像这样:

form method="get" action="/search/"

{% csrf_token %} input type="search" placeholder="搜索" required

button type="submit"搜索/button/form

特别注意在 form 标签下有一个 {% csrf_token %},这是 django 用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是 CSRF 的话也没有关系,只要记住在使用 django 时,前端的表单代码里一定要加上 {% csrf_token %}。

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了 django 后台服务器。表单的 action 属性的值为 /search/,表明用户提交的结果将被发送给 /search/ 这个 URL。我们为这个 URL 绑定一个 django 视图函数,在这个视图函数里完成前面第 2 步提到的过程。假设我们把视图函数的代码写在 blog/views.py 里:

blog/views.pydef search(request):

q = request.GET.get('q')

error_msg = ''

if not q:

error_msg = '请输入关键词'

return render(request, 'blog/errors.html', {'error_msg': error_msg})

post_list = Post.objects.filter(title__icontains=q)

return render(request, 'blog/results.html', {'error_msg': error_msg,

'post_list': post_list})

首先我们使用 request.GET.get('q') 获取到用户提交的搜索关键词。用户通过表单提交的数据 django 为我们保存在 request.GET 里,这是一个类似于 Python 字典的对象,所以我们使用 get 方法从字典里取出键 q 对应的值,即用户的搜索关键词。这里字典的键之所以叫 q 是因为我们的表单中搜索框 input 的 name 属性的值是 q,如果修改了 name 属性的值,那么这个键的名称也要相应修改。

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,而是渲染一个错误页面提示用户请输入关键词。

如果用户输入了搜索关键词,我们就通过 filter 方法从数据库里过滤出符合条件的所有文章。这里的过滤条件是 title__icontains=q,即 title 中包含(contains)关键字 q,前缀 i 表示不区分大小写。这里 icontains 是查询表达式(Field lookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django 内置了很多查询表达式,建议过一遍 django 官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Field lookups

接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:

results.html

{% if error_msg %} p{{ error_msg }}/p{% endif %}

{% for post in post_list %} div

在这里显示文章的相应信息 /div{% empty %} div class="no-post"

没有搜索到符合条件的文章 /div{% endfor %}

有了视图函数后记得把视图函数映射到相应了 URL,前面我们表单数据提交的 URL 为 /search/,因此将视图函数 search 绑定到该 URL 上。

blog/urls.pyurlpatterns = [

# 其他 url 配置

url(r'^search/$', views.search, name='search'),]

大功告成!

结语:以上就是首席CTO笔记为大家介绍的关于django怎么前端加密的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/28087.html