使用表单
关于这页文档
这页文档简单介绍Web 表单的基本概念和它们在Django 中是如何处理的。关于表单API 某方面的细节,请参见表单 API、表单的字段和表单和字段的检验。
除非你计划构建的网站和应用只是发布内容而不接受访问者的输入,否则你将需要理解并使用表单。
Django 提供广泛的工具和库来帮助你构建表单来接收网站访问者的输入,然后处理以及响应输入。
HTML 表单
在HTML中,表单是位于
之间的元素的集合,它们允许访问者输入文本、选择选项、操作对象和控制等等,然后将信息发送回服务器。
某些表单的元素 —— 文本输入和复选框 —— 非常简单而且内建于HTML 本身。其它的表单会复杂些;例如弹出一个日期选择对话框的界面、允许你移动滚动条的界面、使用JavaScript 和CSS 以及HTML 表单
元素来实现操作控制的界面。
与
元素一样,一个表单必须指定两样东西:
where:响应用户输入的URL
how:HTTP 方法
例如,Django Admin 站点的登录表单包含几个
元素:type="text"
用于用户名,type="password"
用于密码,type="submit"
用于“Log in" 按钮。它还包含一些用户看不到的隐藏的文本字段,Django 使用它们来决定下一步的行为。
它还告诉浏览器表单数据应该发往
的action
属性指定的URL —— /admin/
,而且应该使用method
属性指定的HTTP 方法 —— post
。
当触发
元素时,数据将发送给/admin/
。
GET 和 POST
处理表单时候只会用到GET
和 POST
方法。
Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据、对它们进行编码以用于传输、将它们发送到服务器然后接收它的响应。
相反,GET 组合提交的数据为一个字符串,然后使用它来生成一个URL。这个URL 将包含数据发送的地址以及数据的键和值。如果你在Django 文档中做一次搜索,你会立即看到这点,此时将生成一个https://docs.djangoproject.com/search/?q=forms&release=1
形式的URL。
GET
和POST
用于不同的目的。
用于改变系统状态的请求 —— 例如,给数据库带来变化的请求 —— 应该使用POST
。GET
只应该用于不会影响系统状态的请求。
GET
还不适合密码表单,因为密码将出现在URL 中,以及浏览器的历史和服务器的日志中,而且都是以普通的文本格式。它还不适合数据量大的表单和二进制数据,例如一张图片。使用GET 请求作为管理站点的表单具有安全隐患:攻击者很容易模拟表单请求来取得系统的敏感数据。POST
,如果与其它的保护措施结合将对访问提供更多的控制,例如Django 的CSRF 保护。
另一个方面,GET
适合网页搜索这样的表单,因为这种表示一个GET
请求的URL 可以很容易地作为书签、分享和重新提交。
Django 在表单中的角色
处理表单是一件很复杂的事情。考虑一下Django 的Admin 站点,不同类型的大量数据项需要在一个表单中准备好、渲染成HTML、使用一个方便的界面编辑、返回给服务器、验证并清除,然后保存或者向后继续处理。
Django 的表单功能可以简化并自动化大部分这些工作,而且还可以比大部分程序员自己所编写的代码更安全。
Django 会处理表单工作中的三个显著不同的部分:
准备并重新构造数据
为数据创建HTML 表单
接收并处理客户端提交的表单和数据
可以手工编写代码来实现,但是Django 可以帮你完成所有这些工作。
Django 中的表单
我们已经简短讲述HTML 表单,但是HTML的
只是其机制的一部分。
在一个Web 应用中,‘表单’可能指HTML
、或者生成它的Django 的Form
、或者提交时发送的结构化数据、或者这些部分的总和。
Django 的Form 类
表单系统的核心部分是Django 的Form
类。Django 的模型描述一个对象的逻辑结构、行为以及展现给我们的方式,与此类似,Form
类描述一个表单并决定它如何工作和展现。
模型类的字典映射到数据库的字典,与此类似,表单类的字段映射到HTML 的表单
元素。(ModelForm
通过一个Form
映射模型类的字段到HTML 表单的
元素;Django 的Admin 站点就是基于这个)。
表单的字段本身也是类;它们管理表单的数据并在表单提交时进行验证。DateField
和FileField
处理的数据类型差别很大,必须完成不同的事情。
表单字段在浏览器中呈现给用户的是一个HTML 的“widget” —— 用户界面的一个片段。每个字段类型都有一个合适的默认Widget 类,需要时可以覆盖。
实例化、处理和渲染表单
在Django 中渲染一个对象时,我们通常:
在视图中获得它(例如,从数据库中获取)
将它传递给模板上下文
使用模板变量将它扩展为HTML 标记
在模板中渲染表单和渲染其它类型的对象几乎一样,除了几个关键的差别。
在模型实例不包含数据的情况下,在模板中对它做处理很少有什么用处。但是渲染一个未填充的表单却非常有意义 —— 我们希望用户去填充它。
所以当我们在视图中处理模型实例时,我们一般从数据库中获取它。当我们处理表单时,我们一般在视图中实例化它。
当我们实例化表单时,我们可以选择让它为空还是预先填充它,例如使用:
最后一种情况最令人关注,因为它使得用户可以不只是阅读一个网站,而且可以给网站返回信息。
构建一个表单
需要完成的工作
假设你想在你的网站上创建一个简单的表单,以获得用户的名字。你需要类似这样的模板:
这告诉浏览器发送表单的数据到URL /your-name/
,并使用POST
方法。它将显示一个标签为"Your name:"的文本字段,和一个"OK"按钮。如果模板上下文包含一个current_name
变量,它将用于预填充your_name
字段。
你将需要一个视图来渲染这个包含HTML 表单的模板,并提供合适的current_name
字段。
当表单提交时,发往服务器的POST
请求将包含表单数据。
现在你还需要一个对应/your-name/
URL 的视图,它在请求中找到正确的键/值对,然后处理它们。
这是一个非常简单的表单。实际应用中,一个表单可能包含几十上百个字段,其中大部分需要预填充,而且我们预料到用户将来回编辑-提交几次才能完成操作。
我们可能需要在表单提交之前,在浏览器端作一些验证。我们可能想使用非常复杂的字段,以允许用户做类似从日历中挑选日期这样的事情,等等。
这个时候,让Django 来为我们完成大部分工作是很容易的。
在Django 中构建一个表单
Form 类
我们已经计划好了我们的 HTML 表单应该呈现的样子。在Django 中,我们的起始点是这里:
#forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
它定义一个Form
类,只带有一个字段(your_name
)。我们已经对这个字段使用一个友好的标签,当渲染时它将出现在
中(在这个例子中,即使我们省略它,我们指定的label
还是会自动生成)。
字段允许的最大长度通过max_length
定义。它完成两件事情。首先,它在HTML 的
上放置一个maxlength="100"
(这样浏览器将在第一时间阻止用户输入多于这个数目的字符)。它还意味着当Django 收到浏览器发送过来的表单时,它将验证数据的长度。
Form
的实例具有一个is_valid()
方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将:
完整的表单,第一次渲染时,看上去将像:
Your name:
注意它不包含
标签和提交按钮。我们必须自己在模板中提供它们。
视图
发送给Django 网站的表单数据通过一个视图处理,一般和发布这个表单的是同一个视图。这允许我们重用一些相同的逻辑。
当处理表单时,我们需要在视图中实例化它:
#views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})
如果访问视图的是一个GET
请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。这是我们在第一个访问该URL 时预期发生的情况。
如果表单的提交使用POST
请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:form = NameForm(request.POST)
。这叫做”绑定数据至表单“(它现在是一个绑定的表单)。
我们调用表单的is_valid()
方法;如果它不为True
,我们将带着这个表单返回到模板。这时表单不再为空(未绑定),所以HTML 表单将用之前提交的数据填充,然后可以根据要求编辑并改正它。
如果is_valid()
为True
,我们将能够在cleaned_data
属性中找到所有合法的表单数据。在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理。
模板
我们不需要在name.html 模板中做很多工作。最简单的例子是:
根据{{ form }}
,所有的表单字段和它们的属性将通过Django 的模板语言拆分成HTML 标记 。
表单和跨站请求伪造的防护
Django 原生支持一个简单易用的跨站请求伪造的防护。当提交一个启用CSRF 防护的POST
表单时,你必须使用上面例子中的csrf_token
模板标签。然而,因为CSRF 防护在模板中不是与表单直接捆绑在一起的,这个标签在这篇文档的以下示例中将省略。
HTML5 输入类型和浏览器验证
如果你的表单包含URLField
、EmailField
和其它整数字段类似,Django 将使用url
、email
和 number
这样的HTML5 输入类型。默认情况下,浏览器可能会对这些字段进行它们自身的验证,这些验证可能比Django 的验证更严格。如果你想禁用这个行为,请设置form
标签的novalidate
属性,或者指定一个不同的字段,如TextInput
。
现在我们有了一个可以工作的网页表单,它通过Django Form 描述、通过视图处理并渲染成一个HTML
。
这是你入门所需要知道的所有内容,但是表单框架为了提供了更多的内容。一旦你理解了上面描述的基本处理过程,你应该可以理解表单系统的其它功能并准备好学习更多的底层机制。
Django Form 类详解
所有的表单类都作为django.forms.Form
的子类创建,包括你在Django 管理站点中遇到的ModelForm
。
模型和表单
实际上,如果你的表单打算直接用来添加和编辑Django 的模型,ModelForm 可以节省你的许多时间、精力和代码,因为它将根据Model
类构建一个表单以及适当的字段和属性。
绑定的和未绑定的表单实例
绑定的和未绑定的表单 之间的区别非常重要:
表单的is_bound
属性将告诉你一个表单是否具有绑定的数据。
字段详解
考虑一个比上面的迷你示例更有用的一个表单,我们可以用它来在一个个人网站上实现“联系我”功能:
#forms.py
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
我们前面的表单只使用一个字段your_name
,它是一个CharField
。在这个例子中,我们的表单具有四个字段:subject
、message
、sender
和cc_myself
。共用到三种字段类型:CharField
、EmailField
和 BooleanField
;完整的字段类型列表可以在表单字段中找到。
Widgets
每个表单字段都有一个对应的Widget
类,它对应一个HTML 表单Widget
,例如
。
在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField
具有一个TextInput Widget
,它在HTML 中生成一个
。如果你需要
,在定义表单字段时你应该指定一个合适的Widget
,例如我们定义的message
字段。
字段的数据
不管表单提交的是什么数据,一旦通过调用is_valid()
成功验证(is_valid()
返回True
),验证后的表单数据将位于form.cleaned_data
字典中。这些数据已经为你转换好为Python 的类型。
注
此时,你依然可以从request.POST
中直接访问到未验证的数据,但是访问验证后的数据更好一些。
在上面的联系表单示例中,cc_myself
将是一个布尔值。类似地,IntegerField
和FloatField
字段分别将值转换为Python 的int
和float
。
下面是在视图中如何处理表单数据:
#views.py
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')
提示
关于Django 中如何发送邮件的更多信息,请参见发送邮件。
有些字段类型需要一些额外的处理。例如,使用表单上传的文件需要不同地处理(它们可以从request.FILES
获取,而不是request.POST
)。如何使用表单处理文件上传的更多细节,请参见绑定上传的文件到一个表单。
使用表单模板
你需要做的就是将表单实例放进模板的上下文。如果你的表单在Contex
t 中叫做form
,那么 {{ form }}
将正确地渲染它的
和
元素。
表单渲染的选项
表单模板的额外标签
不要忘记,表单的输出不 包含
标签,和表单的submit
按钮。你必须自己提供它们。
对于/
对,还有几个输出选项:
{{ form.as_table }}
以表格的形式将它们渲染在 标签中
{{ form.as_p }}
将它们渲染在
标签中
{{ form.as_ul }}
将它们渲染在
标签中
注意,你必须自己提供 或
元素。
下面是我们的ContactForm
实例的输出{{ form.as_p }}
:
Subject:
Message:
Sender:
Cc myself:
注意,每个表单字段具有一个ID
属性并设置为id_
,它被一起的label
标签引用。它对于确保屏幕阅读软件这类的辅助计算非常重要。你还可以自定义label 和 id 生成的方式。
更多信息参见 输出表单为HTML。
手工渲染字段
我们没有必要非要让Django 来分拆表单的字段;如果我们喜欢,我们可以手工来做(例如,这样允许重新对字段排序)。每个字段都是表单的一个属性,可以使用{{ form.name_of_field }}
访问,并将在Django 模板中正确地渲染。例如:
{{ form.non_field_errors }}
{{ form.subject.errors }}
Email subject:
{{ form.subject }}
{{ form.message.errors }}
Your message:
{{ form.message }}
{{ form.sender.errors }}
Your email address:
{{ form.sender }}
{{ form.cc_myself.errors }}
CC yourself?
{{ form.cc_myself }}
完整的
元素还可以使用label_tag()
生成。例如:
{{ form.subject.errors }}
{{ form.subject.label_tag }}
{{ form.subject }}
渲染表单的错误信息
当然,这个便利性的代价是更多的工作。直到现在,我们没有担心如何展示错误信息,因为Django 已经帮我们处理好。在下面的例子中,我们将自己处理每个字段的错误和表单整体的各种错误。注意,表单和模板顶部的{{ form.non_field_errors }}
查找每个字段的错误。
使用{{ form.name_of_field.errors }}
显示表单错误的一个清单,并渲染成一个ul
。看上去可能像:
这个ul
有一个errorlist
CSS 类型,你可以用它来定义外观。如果你希望进一步自定义错误信息的显示,你可以迭代它们来实现:
{% if form.subject.errors %}
{% for error in form.subject.errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
空字段错误(以及使用form.as_p()
时渲染的隐藏字段错误)将渲染成一个额外的CSS 类型nonfield
以帮助区分每个字段的错误信息。例如,{{ form.non_field_errors }}
看上去会像:
Changed in Django 1.8:
添加上面示例中提到的nonfield CSS 类型。
参见Forms API 以获得关于错误、样式以及在模板中使用表单属性的更多内容。
迭代表单的字段
如果你为你的表单使用相同的HTML,你可以使用{% for %}
循环迭代每个字段来减少重复的代码:
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% endfor %}
{{ field }}
中有用的属性包括:
{{ field.label }}
字段的label
,例如Email address
。
{{ field.label_tag }}
包含在HTML
标签中的字段Label
。它包含表单的label_suffix
。例如,默认的label_suffix
是一个冒号:
Email address:
{{ field.id_for_label }}
用于这个字段的ID
(在上面的例子中是id_email
)。如果你正在手工构造label
,你可能想使用它代替label_tag
。如果你有一些内嵌的JavaScript 并且想避免硬编码字段的ID
,这也是有用的。
{{ field.value }}
字段的值,例如someone@example.com
。
{{ field.html_name }}
输入元素的name
属性中将使用的名称。它将考虑到表单的前缀。
{{ field.help_text }}
与该字段关联的帮助文档。
{{ field.errors }}
输出一个
,包含这个字段的验证错误信息。你可以使用{% for error in field.errors %}
自定义错误的显示。 这种情况下,循环中的每个对象只是一个包含错误信息的简单字符串。
{{ field.is_hidden }}
如果字段是隐藏字段,则为True
,否则为False
。作为模板变量,它不是很有用处,但是可以用于条件测试,例如:
{% if field.is_hidden %}
{% endif %}
{{ field.field }}
表单类中的Field
实例,通过BoundField
封装。你可以使用它来访问Field
属性,例如{% char_field.field.max_length %}。
迭代隐藏和可见的字段
如果你正在手工布局模板中的一个表单,而不是依赖Django 默认的表单布局,你可能希望将
字段与非隐藏的字段区别对待。例如,因为隐藏的字段不会显示,在该字段旁边放置错误信息可能让你的用户感到困惑 —— 所以这些字段的错误应该有区别地来处理。
Django 提供两个表单方法,它们允许你独立地在隐藏的和可见的字段上迭代:hidden_fields()
和visible_fields()
。下面是使用这两个方法对前面一个例子的修改:
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% endfor %}
这个示例没有处理隐藏字段中的任何错误信息。通常,隐藏字段中的错误意味着表单被篡改,因为正常的表单填写不会改变它们。然而,你也可以很容易地为这些表单错误插入一些错误信息显示出来。
可重用的表单模板
如果你的网站在多个地方对表单使用相同的渲染逻辑,你可以保存表单的循环到一个单独的模板中来减少重复,然后在其它模板中使用include
标签来重用它:
# In your form template:
{% include "form_snippet.html" %}
# In form_snippet.html:
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% endfor %}
如果传递到模板上下文中的表单对象具有一个不同的名称,你可以使用include
标签的with
参数来对它起个别名:
{% include "form_snippet.html" with form=comment_form %}
如果你发现自己经常这样做,你可能需要考虑一下创建一个自定义的 inclusion
标签。
更深入的主题
这里只是基础,表单还可以完成更多的工作:
另见
表单参考 覆盖完整的API 参考,包括表单字段、表单Widget 以及表单和字段的验证。
译者:Django 文档协作翻译小组,原文:Overview。
本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。
你可能感兴趣的:(django 1.8 官方文档翻译: 5-1-1 使用表单)
deepseek本地部署后做微调训练实现智能对话的一些建议
慧香一格
AI 学习 deepseek 服务器 AI
在本地部署大模型后,进行微调和训练以实现智能对话,通常需要按照以下步骤操作。以下是详细的指导内容:1.准备数据集在微调大模型之前,需要准备适合的训练数据集。数据集应满足以下要求:格式:通常使用JSONL(JSONLines)格式,每行包含一个训练样本。内容:数据应包含对话的上下文和目标输出,例如:{"context":"你好!今天天气不错。","response":"是的,天气很好,适合出去走走。
在linux 中搭建deepseek 做微调,硬件配置要求说明
慧香一格
学习 AI linux 服务器 deepseek
搭建可参考使用deepseek-CSDN博客官方网站:DeepSeekDeepSeek是一个基于深度学习的开源项目,旨在通过深度学习技术来提升搜索引擎的准确性和效率。如果你想在Linux系统上搭建DeepSeek,你可以遵循以下步骤。这里我将提供一个基本的指导,帮助你从零开始搭建一个基础的DeepSeek环境。1.安装依赖首先,确保你的Linux系统上安装了Python和pip。DeepSeek主
函数的返回值的使用
print('name')
Python python 开发语言 pycharm visual studio code 数据结构
笔记defcalc(a,b):print(a+b)calc(10,20)print(calc(1,2))#Nonedefcalc2(a,b):s=a+breturns#将s返回给函数的调用处去处理print('-'*8)get_s=calc2(1,2)#储存到变量中print(get_s)get_s2=calc2(calc2(1,2),3)#1+2+3先去执行calc2(1,2)返回结果为3,再去
【binlog和redolog有什么区别?】
@Corgi
Java面试题 java 数据库 面试题
binlog和redolog有什么区别?1.定义和功能2.记录内容3.文件使用方式4.作用和应用场景5.示例对比总结1.定义和功能Binlog(二进制日志):定义:Binlog是MySQL的二进制日志系统,记录了所有更改数据库数据的语句的信息,以事件的形式保存。功能:主要用于数据恢复、主从复制以及数据审计。RedoLog(重做日志):定义:RedoLog是InnoDB存储引擎特有的日志系统,记录了
m1处理器macbook使用qemu模拟运行RT-Thread
想学rtos的带土
m1 mac rt-thread iot 物联网 macos risc-v
最近准备深入学习一下RTOS,好巧不巧的是在前几天换了m1的macbookair,于是想要在电脑上配置一下RT-Thread的开发环境,网上搜了一大堆,没有看到符合需求的相关教程(真的很少很少,哭了,给我整崩溃!)。不过在几天的东平西凑后,成功在我的电脑上完成了RT-Thread的编译与运行。现在分享出来,有需要的可以参考一下。1.工具python3.11.5.我这里应该是用的苹果自带的,这里不用
PHP + XlsWriter实现百万级数据导入导出,如何实现
程序员阿凡提
PHP实战教程 php 开发语言
在PHP中使用XlsWriter(如xlswriter扩展)处理百万级数据的导入导出,需重点解决内存占用和性能问题。以下是分步骤的实现方案:一、环境准备1安装xlswriter扩展从PECL安装:peclinstallxlswriter在php.ini中启用扩展:extension=xlswriter.so2调整PHP配置处理大数据时需增加内存和执行时间限制:memory_limit=1024Mm
封装websocket,兼容uniapp及普通vue3应用
一个水货程序员
websocket uni-app 网络协议
本文将实现websocket的封装,采用typescript+vue3实现,同时支持uniapp中使用。主要实现两个部分:websocket.core.ts,一个封装的websocket对象,用于处理websocket断线重连及生命周期钩子触发useWebsocket.ts,采用vuehook封装上述对象,将实例属性转换为响应式属性以供页面组件内使用websocket.core.tstypeTim
前端项目git提交时做代码规范验证
一个水货程序员
git 前端 代码规范
前端项目git提交时做代码规范验证需要使用到的插件:husky,是一个GitHook工具,为git客户端增加hook的。lint-staged,在git提交前,进行代码规则检查确保入库的代码都符合代码规则,如果对整个项目进行lint这样速度太慢,lint-staged可以让lint只检测暂存区的文件,提高检测速度。当前依赖版本:husky版本:^8.0.1,lint-staged版本:^13.0.
10分钟搭建钉钉DeepSeek AI助手:无代码实现智能对话
ivwdcwso
运维 钉钉 人工智能 运维 DeepSeek AI
引言DeepSeek最近发布了两款先进的AI模型:V3和R1。其中V3适用于对话AI和内容生成等通用场景,R1则专注于编程和数学等推理任务。借助阿里云百炼提供的DeepSeek模型API,我们可以轻松实现与DeepSeek的对话功能。本文将详细介绍如何使用阿里云AppFlow在钉钉中快速配置DeepSeekAI助手,整个过程无需编写代码,10分钟即可完成。一、创建钉钉应用©ivwdcwso(ID:
码农避坑指南:Python编程全领域易错点深度剖析与解决方案
tekin
Python python 编程误区 性能优化 代码质量 数据安全 特定领域编程 开发技巧
在编程世界中,无论是新手还是经验丰富的开发者,都难免陷入各种误区。从Python多线程的使用到微服务架构的管理,每个编程领域都隐藏着容易被忽视的陷阱。这些误区不仅影响代码性能、可读性和维护性,还可能带来安全隐患。本文将深入剖析编程全领域的易错点,通过实际案例和详细讲解,为你提供全面的解决方案,助你避开这些“坑”,编写出更高效、更安全、更易维护的代码。编程语言特性与最佳实践Python多线程与GIL
Docker下使用llama.cpp部署带Function calling和Json Mode功能的Mistral 7B模型
shizidushu
docker llama 语言模型 llama.cpp mistral-7b
Docker下使用llama.cpp部署带Functioncalling和JsonMode功能的Mistral7B模型说明:首次发表日期:2024-08-27参考:https://www.markhneedham.com/blog/2024/06/23/mistral-7b-function-calling-llama-cpp/https://github.com/abetlen/llama-cp
SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别
指尖下的技术
Java面试题 spring cloud eureka zookeeper
dEureka和Zookeeper都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面:设计理念Eureka:是基于RESTful风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协调而设计的,提供了一种通用的分布式数据管理和协调服务,其功能更侧重于分布式系统中的数据一致性、节点选举、配置管理等
Docker安装pypiserver私服
MasonYyp
docker 容器 运维
Docker安装pypiserver私服1简介Python开源包管理工具有pypiserver、devpi和Nexus等,pypiserver安装部署比较简单,性能也不错。搭建pypiserver私服,可以自己构建镜像,也可以使用官网的docker镜像。#Github地址https://github.com/pypiserver/pypiserver2安装使用docker安装pypiserver#
Win11 配置 TeXstudio 编辑器教程
『₣λ¥√≈üĐ』
编辑器 学习 数学建模 论文笔记
以下是关于在Windows11系统上配置TeXstudio编辑器以使用LaTeX的教程。文章从安装必要的组件到实际测试的过程进行了详细的说明。一、简介在Windows11上使用LaTeX需要完成以下两步:选择一个TeX发行版并安装(本文以TeXLive为例,推荐从清华大学镜像站下载)。选择并安装LaTeX编辑器(本文选择TeXstudio)。二、TeXLive安装本文使用的TeXLive是最新版,
Uptime Kuma:开源的简单监控解决方案
rock——you
开源
UptimeKuma:开源的简单监控解决方案在现代的IT基础设施中,保持系统、服务和应用程序的可用性和健康性至关重要。传统的监控工具往往过于复杂或功能过于庞大,难以满足小型团队或开发者的需求。UptimeKuma是一个轻量级、易于使用的开源监控工具,旨在提供简单且强大的服务监控功能。它允许用户轻松监控HTTP(s)服务、TCP端口、Ping等,适合个人、开发者以及小型团队使用。本文将介绍Uptim
ios 小程序 虚拟商品支付怎么解
rock——you
前端 ios 小程序 cocoa
在iOS小程序中涉及虚拟商品支付的问题需要特别注意,因为苹果AppStore的审核规则(AppStoreReviewGuidelines)对虚拟商品的支付有严格的规定,任何涉及虚拟商品的支付必须使用苹果的IAP(In-AppPurchase)支付。以下是解决iOS小程序虚拟商品支付的思路和常见的合规方案:苹果的政策背景根据AppStore审核指南的规定:虚拟商品的支付:涉及虚拟商品或服务(如会员订
SpringCloud面试题
御风行云天
面试题大全 spring cloud spring 后端
SpringCloud面试题1SpringCloud基础与原理1.1什么是SpringCloud?1.2解释SpringCloud中微服务架构的优势。1.3描述SpringCloud与SpringBoot的关系。2服务发现与注册2.1SpringCloud如何实现服务发现和注册?2.2使用Eureka服务注册中心的原因。2.3描述使用Consul或Zookeeper作为服务注册中心的场景。3配置管
Oracle 数据库管理工具
鱼弦
人工智能时代 数据库 oracle
Oracle数据库管理工具使用SQL*Plus简介SQL*Plus是Oracle提供的一个命令行界面工具,用于与Oracle数据库进行交互。它允许用户执行SQL、PL/SQL命令,查看和管理数据库对象。应用使用场景数据库查询:执行简单或复杂的SQL查询。脚本执行:运行批量SQL脚本以自动化数据库操作。日常管理任务:如创建用户、分配权限、监控系统性能等。实际详细应用代码示例实现#连接到Oracle数
VB.NET基于WEB房地产评估系统(源代码+文档)
csdn663648
.net 前端 microsoft
资料介绍:--------------摘要--------------房地产评估系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。本系统特有的房屋基本情况、专业评估人员、估价方法等。经过分析,我们使用MICROSOFT公司的VISUALBA
mac os 使用 qemu-system-arm 进行调试
asdhjagsgewuj
arm开发
1.在macos上安装虚拟网络设备tapbrewinstall--casktunnelblick2.下载内核文件和镜像QEMU系统模式仿真,首先我们需要从debian官网下载kernel和image,地址如下:https://people.debian.org/~aurel32/qemu/mipsel/「为什么我们这里知道使用arm呢,你可以在文件系统内随便找一个ELF文件,然后使用file命令查
本地部署【DeepSeek-R1】,搭建自己的【知识库】
行者无疆xcc
AI ai
使用deepseek+ollama+anythingLLM搭建简易知识库ollamadeepseekchatboxanythingLLM一、本地部署Ollama1.简要说明ollama可以看成是大模型的宿主平台管理用户的输入和大模型的输出注:如果运行不起来,可能跟硬件配置有关2.基本操作ollama:下载&安装:https://ollama.com/验证是否安装成功:命令行下输入ollama-vd
使用OpenCV在Visual Studio上编译x86或x64平台的应用程序
程序世界航海
opencv visual studio 人工智能 编程
OpenCV是一个广泛使用的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。如果你想在VisualStudio上编译一个使用OpenCV的应用程序,并且需要针对特定的x86或x64平台进行优化,那么本文将为你提供一些指导。以下是在VisualStudio中编译x86或x64平台上的OpenCV应用程序的步骤:步骤1:安装VisualStudio和OpenCV首先,确保你已经安装了最新版本的V
首都国际会展中心启用,首展聚焦汽车后市场全产业链
2401_89023604
汽车 人工智能 大数据
首都国际会展中心启用,首展聚焦汽车后市场全产业链2025年2月21日-24日,首都国际会展中心(新国展二期)迎来了其启用后的首场大型展览——第36届中国国际汽车服务用品及设备展览会暨中国国际新能源汽车技术、零部件及服务展览会(雅森北京展)。此次展览不仅是汽车后市场全产业链的开年第一展,更是新展馆投入使用的里程碑事件。作为北京市单体规模最大、功能最完善、技术最先进的综合型会展场馆,新国展二期经过三年
腾讯云点播Web端上传视频+SDK使用
官方链接:Web端上传SDK腾讯云控制台客户端上传签名签名生成示例1、Web端嵌入云点播SDK//安装稳定版本npminstallvod-js-sdk-v6在对应的页面引入importTcVodfrom'vod-js-sdk-v6'入完成后,需要生成签名,签名需要通过SecretId、SecretKey来生成SecretId、SecretKey生成:腾讯云控制台进入云控制台后,点击新建密钥:获取到
破解微服务疑难杂症:2025年全解决方案
zxzy_org
微服务 架构 云原生 算法
微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等问题。2025年的全解决方案主要集中在以下几个方面:首先,通过使用先进的服务网格(ServiceMesh)技术,可以显著简化服务间通信和负载均衡管理,同时增强了服务的可观测性和安全性。其次,在数
Docker安装分布式vLLM
MasonYyp
docker 分布式 容器
Docker安装分布式vLLM1介绍vLLM是一个快速且易于使用的LLM推理和服务库,适合用于生产环境。单主机部署会遇到显存不足的问题,因此需要分布式部署。分布式安装方法https://docs.vllm.ai/en/latest/serving/distributed_serving.html2安装方法⚠️注意:前期一定要把docker环境、运行时和GPU安装好。CUDAVersion:12.4
如何为中小企业选择合适的OA办公系统解决方案
oa开源
考虑云端和本地部署:对于中小企业来说,选择云端或者本地部署的OA系统都有各自的优劣势。云端OA系统通常更灵活,易于使用,并且无需大量的IT基础设施投入。而本地部署的OA系统则可能更适合对数据安全和隐私保护有较高要求的企业。择优而行:在研究市场时,中小企业可能会发现有很多OA系统提供商,但并非每一个都能满足自己的需求。建议企业可以将几个最有潜力的方案列出来,然后通过试用和评估来确定最适合自己的那个。
博客搭建之路:hexo增加搜索功能
后端
hexo增加搜索功能hexo版本5.0.2npm版本6.14.7next版本7.8.0作为一个博客,没有搜索功能,如何在大批文章中找到自己想要的,那在hexo中如何增加搜索功能呢?search:path:search.jsonfield:post在博客目录下安装npminstallhexo-generator-search--save,此时使用hexocl&&hexog就会在博客public目录下
SpringBoot系列——WebMvcConfigurer介绍
OkidoGreen
SpringBoot-原理
为什么要使用WebMvcConfigurer?WebMvcConfigurer是一个接口,提供很多自定义的拦截器,例如跨域设置、类型转化器等等。可以说此接口为开发者提前想到了很多拦截层面的需求,方便开发者自由选择使用。由于Spring5.0废弃了WebMvcConfigurerAdapter,所以WebMvcConfigurer继承了WebMvcConfigurerAdapter大部分内容。Web
Golang 框架介绍
wwwenhx
golang 开发语言 后端
以下是一篇可直接发布到CSDN的关于Golang主流框架的技术文章,包含框架对比、使用场景和代码示例:---#Golang主流框架全解析:从Web开发到微服务##引言Go语言凭借其高性能和简洁语法,已成为云原生时代的宠儿。本文将全面解析Go生态中的热门框架,涵盖Web开发、微服务、ORM等领域,助你根据业务需求选择最佳技术方案。---##一、Web开发框架###1.Gin(轻量之王)**特点**:
Java开发中,spring mvc 的线程怎么调用?
小麦麦子
spring mvc
今天逛知乎,看到最近很多人都在问spring mvc 的线程http://www.maiziedu.com/course/java/ 的启动问题,觉得挺有意思的,那哥们儿问的也听仔细,下面的回答也很详尽,分享出来,希望遇对遇到类似问题的Java开发程序猿有所帮助。
问题:
在用spring mvc架构的网站上,设一线程在虚拟机启动时运行,线程里有一全局
maven依赖范围
bitcarter
maven
1.test 测试的时候才会依赖,编译和打包不依赖,如junit不被打包
2.compile 只有编译和打包时才会依赖
3.provided 编译和测试的时候依赖,打包不依赖,如:tomcat的一些公用jar包
4.runtime 运行时依赖,编译不依赖
5.默认compile
依赖范围compile是支持传递的,test不支持传递
1.传递的意思是项目A,引用
Jaxb org.xml.sax.saxparseexception : premature end of file
darrenzhu
xml premature JAXB
如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误:
org.xml.sax.saxparseexception : premature end of file
很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new In
CSS Specificity
周凡杨
html 权重 Specificity css
有时候对于页面元素设置了样式,可为什么页面的显示没有匹配上呢? because specificity
CSS 的选择符是有权重的,当不同的选择符的样式设置有冲突时,浏览器会采用权重高的选择符设置的样式。
规则:
HTML标签的权重是1
Class 的权重是10
Id 的权重是100
java与servlet
g21121
servlet
servlet 搞java web开发的人一定不会陌生,而且大家还会时常用到它。
下面是java官方网站上对servlet的介绍: java官网对于servlet的解释 写道
Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending and enha
eclipse中安装maven插件
510888780
eclipse maven
1.首先去官网下载 Maven:
http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.2.3-bin.tar.gz
下载完成之后将其解压,
我将解压后的文件夹:apache-maven-3.2.3,
并将它放在 D:\tools目录下,
即 maven 最终的路径是:D:\tools\apache-mave
jpa@OneToOne关联关系
布衣凌宇
jpa
Nruser里的pruserid关联到Pruser的主键id,实现对一个表的增删改,另一个表的数据随之增删改。
Nruser实体类
//*****************************************************************
@Entity
@Table(name="nruser")
@DynamicInsert @Dynam
我的spring学习笔记11-Spring中关于声明式事务的配置
aijuans
spring 事务 配置
这两天学到事务管理这一块,结合到之前的terasoluna框架,觉得书本上讲的还是简单阿。我就把我从书本上学到的再结合实际的项目以及网上看到的一些内容,对声明式事务管理做个整理吧。我看得Spring in Action第二版中只提到了用TransactionProxyFactoryBean和<tx:advice/>,定义注释驱动这三种,我承认后两种的内容很好,很强大。但是实际的项目当中
java 动态代理简单实现
antlove
java handler proxy dynamic service
dynamicproxy.service.HelloService
package dynamicproxy.service;
public interface HelloService {
public void sayHello();
}
dynamicproxy.service.impl.HelloServiceImpl
package dynamicp
JDBC连接数据库
百合不是茶
JDBC编程 JAVA操作oracle数据库
如果我们要想连接oracle公司的数据库,就要首先下载oralce公司的驱动程序,将这个驱动程序的jar包导入到我们工程中;
JDBC链接数据库的代码和固定写法;
1,加载oracle数据库的驱动;
&nb
单例模式中的多线程分析
bijian1013
java thread 多线程 java多线程
谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。
饿汉式:
package com.bijian.study;
public class Singleton {
private Singleton() {
}
// 注意这是private 只供内部调用
private static
javascript读取和修改原型特别需要注意原型的读写不具有对等性
bijian1013
JavaScript prototype
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有
【持久化框架MyBatis3六】MyBatis3集成第三方DataSource
bit1129
dataSource
MyBatis内置了数据源的支持,如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<data
我程序中用到的urldecode和base64decode,MD5
bitcarter
c MD5 base64decode urldecode
这里是base64decode和urldecode,Md5在附件中。因为我是在后台所以需要解码:
string Base64Decode(const char* Data,int DataByte,int& OutByte)
{
//解码表
const char DecodeTable[] =
{
0, 0, 0, 0, 0, 0
腾讯资深运维专家周小军:QQ与微信架构的惊天秘密
ronin47
社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社交平台更是火到爆,QQ和微信坐拥几亿的粉丝,QQ空间和朋友圈各种刷屏,写心得,晒照片,秀视频,那么谁来为企鹅保驾护航呢?支撑QQ和微信海量数据背后的架构又有哪些惊天内幕呢?本期大讲堂的内容来自今年2月份ChinaUnix对腾讯社交网络运营服务中心
java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素
bylijinnan
java
public class MinOfShiftedArray {
/**
* Q69 旋转数组的最小元素
* 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
* 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
*/
publ
看博客,应该是有方向的
Cb123456
反省 看博客
看博客,应该是有方向的:
我现在就复习以前的,在补补以前不会的,现在还不会的,同时完善完善项目,也看看别人的博客.
我刚突然想到的:
1.应该看计算机组成原理,数据结构,一些算法,还有关于android,java的。
2.对于我,也快大四了,看一些职业规划的,以及一些学习的经验,看看别人的工作总结的.
为什么要写
[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖
comsci
开源项目
为什么这样说呢? 因为科学和技术的发展有时候需要一个平缓和长期的积累过程,但是行政和商业体系本身充满各种不稳定性和不确定性,如果你希望长期从事某个科研项目,但是却又必须依赖于某种行政和商业体系,那其中的过程必定充满各种风险。。。
所以,为避免这种不确定性风险,我
一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )
cwqcwqmax9
sql
见 http://www.itpub.net/forum.php?mod=viewthread&tid=239011
Web翻页优化实例
提交时间: 2004-6-18 15:37:49 回复 发消息
环境:
Linux ve
Hibernat and Ibatis
dashuaifu
Hibernate ibatis
Hibernate VS iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mappi
备份MYSQL脚本
dcj3sjt126com
mysql
#!/bin/sh
# this shell to backup mysql
#1413161683@qq.com (QQ:1413161683 DuChengJiu)
_dbDir=/var/lib/mysql/
_today=`date +%w`
_bakDir=/usr/backup/$_today
[ ! -d $_bakDir ] && mkdir -p
iOS第三方开源库的吐槽和备忘
dcj3sjt126com
ios
转自
ibireme的博客 做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽。 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code、SourceForge等地方。由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库。 首先整理了一份
Github上排名靠
html wlwmanifest.xml
eoems
html xml
所谓优化wp_head()就是把从wp_head中移除不需要元素,同时也可以加快速度。
步骤:
加入到function.php
remove_action('wp_head', 'wp_generator');
//wp-generator移除wordpress的版本号,本身blog的版本号没什么意义,但是如果让恶意玩家看到,可能会用官网公布的漏洞攻击blog
remov
浅谈Java定时器发展
hacksin
java 并发 timer 定时器
java在jdk1.3中推出了定时器类Timer,而后在jdk1.5后由Dou Lea从新开发出了支持多线程的ScheduleThreadPoolExecutor,从后者的表现来看,可以考虑完全替代Timer了。
Timer与ScheduleThreadPoolExecutor对比:
1.
Timer始于jdk1.3,其原理是利用一个TimerTask数组当作队列
移动端页面侧边导航滑入效果
ini
jquery Web html5 css javascirpt
效果体验:http://hovertree.com/texiao/mobile/2.htm可以使用移动设备浏览器查看效果。效果使用到jquery-2.1.4.min.js,该版本的jQuery库是用于支持HTML5的浏览器上,不再兼容IE8以前的浏览器,现在移动端浏览器一般都支持HTML5,所以使用该jQuery没问题。HTML文件代码:
<!DOCTYPE html>
<h
AspectJ+Javasist记录日志
kane_xie
aspectj javasist
在项目中碰到这样一个需求,对一个服务类的每一个方法,在方法开始和结束的时候分别记录一条日志,内容包括方法名,参数名+参数值以及方法执行的时间。
@Override
public String get(String key) {
// long start = System.currentTimeMillis();
// System.out.println("Be
redis学习笔记
MJC410621
redis NoSQL
1)nosql数据库主要由以下特点:非关系型的、分布式的、开源的、水平可扩展的。
1,处理超大量的数据
2,运行在便宜的PC服务器集群上,
3,击碎了性能瓶颈。
1)对数据高并发读写。
2)对海量数据的高效率存储和访问。
3)对数据的高扩展性和高可用性。
redis支持的类型:
Sring 类型
set name lijie
get name lijie
set na
使用redis实现分布式锁
qifeifei
在多节点的系统中,如何实现分布式锁机制,其中用redis来实现是很好的方法之一,我们先来看一下jedis包中,有个类名BinaryJedis,它有个方法如下:
public Long setnx(final byte[] key, final byte[] value) {
checkIsInMulti();
client.setnx(key, value);
ret
BI并非万能,中层业务管理报表要另辟蹊径
张老师的菜
大数据 BI 商业智能 信息化
BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP、CRM、SCM、进销存、HER、OA等。
BI系统不同于传统的管理信息系统,他号称是一个整体应用的解决方案,是融入管理思想的强大系统:有着系统整体的设计思想,支持对所有
安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题
wudixiaotie
function
1.在~/.bashrc最后加入
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
2.重新启动terminal输入:
rvm use ruby-2.2.1 --default
把当前安装的ruby版本设为默