学习PHP和XML Django写简单POST 2016.03.23回顾

本文详细介绍了PHP与XML交互的方法,包括如何通过JS和AJAX获取并处理XML数据。同时,文章阐述了使用Django编写Web接口的逻辑,包括URL配置、视图函数实现及CSRF令牌的处理。最后,讨论了解决扣款短信问题的方案,并分享了在HTML表单中添加CSRF令牌以增强安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x01. 继续学习了php对xml交互,html部分主要是一个select标签,option标签不同艺术家名字,一个提示文本区域根据选择的艺术家显示对应的唱片信息;xml部分是一个唱片信息的大集合,js部分负责向ajax部分,向后台get唱片信息,后台php做处理,根据获得的艺术家名字,加载xml文件,根据xml DOM搜索方法找到艺术家的唱片,把唱片信息输出在固定的文本区域p标签之中,要注意的一个地方是xml DOM,元素标签的下一层是文本标签,也就是文本被看作是独立的标签,要用->childNodes->item(0)->nodeValue去取值

0x02. 提供web接口,写好了用django接受post的逻辑,逻辑比较简单,urls.py负责URL配置,配好url,第二个参数是app.views.function,后面可以配置name值方便复用,URL和views对应,views中写好url配置的方法,具体逻辑,方法传进去一个request,获取对应的参数名,封装参数HttpResponse返回给前台

@csrf_exempt
def model(request):
    id = request.POST['national_id']
    mydict = {'national_id':id}
    return HttpResponse(json.dumps(mydict),content_type='application/json')
这就是一个url和views的逻辑,就完成了一个post,但是用django发现会403 forbiden,因为django需要一个csrf_token,如果做成接口,对方肯定不会有csrf_token,所以要from django.views.decorators.csrf import csrf_exempt,引入一个csrf_exempt修饰符来修饰post接收函数,使得可以不需要csrf_token,如上面代码所示;另外一方面,如果前台自己写一个简单的表单提交post,写好一个html表单中放进app/templates/app/下,同样也是写好url配置,然后在views中渲染这个模板html,

def index(request):
    return render(request, 'index.html')
HTML表单可以加入一个csrf token,负责服务端默认开启csrf校验,直接提交会403

<!DOCTYPE html>
<html>
<body>
<p>输入身份证号查询审批结果</p>
<form action="/model/" method="post">
    {% csrf_token %}
    national_id: <input type="text" name="national_id"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
这个将在后台生成一个隐藏的表单域,包含了csrf_token的值,将在submit的时候发送给后台。

我现在的一个问题是csrf_token服务端是在哪个部分进行校验的?这部分我自己编写后端逻辑所不需要考虑的!

0x03. 继续去解决扣款短信的问题,经过多方讨论,给了相关部分一个方案,我这边确实是无能为力了。反正这个解决问题就是不要怕麻烦,多问,多讨论

0x04. 晚上回家写好了募捐文案发布在了主页上,还是陆续收到了几笔捐款,给了我一定的动力继续把站点做好,关于合作那方面昨天晚上让我思考了很久,我觉得该怎么说就怎么说,不要怕尴尬,一是一二是二,在那里犹豫不决,欲言又止,简直是浪费时间!本来昨天晚上应该可以干更多的事情!

<think>我们正在处理一个关于Django的问题,用户希望导入表单模块User模型。根据引用内容,我们知道在Django中,用户认证系统通常使用`django.contrib.auth.models`中的`User`模型。同时,创建表单可以使用`django.forms`模块。 用户提供的代码片段是: ```python from django import forms from django.contrib.auth.models import User ``` 这个导入语句本身是正确的。但是,根据引用[2]引用[3],我们知道有时需要扩展用户模型,比如通过继承`AbstractUser`来添加额外字段。如果用户已经自定义了用户模型(如引用[2]中的`UserInfo`),那么应该导入自定义的模型而不是默认的`User`。 但是,用户的问题中并没有提到自定义用户模型,所以我们可以假设用户使用的是默认的`User`模型。因此,上述导入语句是合适的。 此外,引用[1]、[4]、[5]提到了关于登录视图的问题,但用户当前的问题是关于表单用户模型的导入,因此这些引用可能不直接相关。不过,我们可以推测用户可能在创建一个与用户相关的表单,比如用户注册表单或登录表单。 下面我们将创建一个使用`User`模型的表单示例,例如一个用户注册表单。 ### 创建用户注册表单 在Django中,我们可以创建一个继承自`forms.ModelForm`的表单类,用于用户注册。这个表单将使用`User`模型,并包含我们需要的字段。 ```python from django import forms from django.contrib.auth.models import User class UserRegistrationForm(forms.ModelForm): password = forms.CharField(label='密码', widget=forms.PasswordInput) password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name') def clean_password2(self): cd = self.cleaned_data if cd['password'] != cd['password2']: raise forms.ValidationError('两次输入的密码不一致!') return cd['password2'] ``` 在这个表单中,我们添加了两个密码字段(用于密码确认),并重了`clean_password2`方法以验证两次输入的密码是否一致。然后,我们在`Meta`类中指定使用`User`模型,并选择了一些字段。 ### 注意事项 1. 如果用户已经自定义了用户模型(如引用[2]中的`UserInfo`),那么应该导入自定义的模型,例如: ```python from .models import UserInfo ``` 然后在表单的`Meta`类中将`model`指定为`UserInfo`。 2.Django 2.1及以上版本,登录视图的导入方式发生了变化(如引用[4]引用[5]所示),但用户的问题是关于表单用户模型的,所以暂时不需要考虑登录视图。 ### 相关问题 根据用户的问题我们的回答,生成以下相关问题: 1. 如何扩展Django默认的User模型? 2. 如何在Django中创建用户注册视图? 3. 如何处理用户注册表单的验证保存? 4. 自定义用户模型后,如何修改登录表单? 5. Django表单中如何添加自定义验证逻辑?</think>根据您提供的引用信息当前需求,我将帮助您解决Django表单用户模型导入的相关问题。 ### 导入Django表单用户模型 您需要的导入语句本身是正确的: ```python from django import forms from django.contrib.auth.models import User ``` ### 常见问题解析 1. **自定义用户模型**(如引用[2][3]所示): 当您扩展了`AbstractUser`时,应导入自定义模型而非默认User: ```python from .models import CustomUser # 替换为您的自定义模型 ``` 2. **视图导入问题**(如引用[1][4][5]所示): 在Django 2.x+版本中,登录视图的导入方式已变更: ```python # Django 1.x 方式 (已弃用) from django.contrib.auth.views import login # Django 2.x+ 正确方式 from django.contrib.auth.views import LoginView ``` ### 完整表单示例 ```python from django import forms from django.contrib.auth.models import User # 或您的自定义模型 from django.contrib.auth.forms import AuthenticationForm # 登录表单基类 class UserRegistrationForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name') def clean_password2(self): # 验证两次密码是否匹配 if self.cleaned_data['password'] != self.cleaned_data['password2']: raise forms.ValidationError("两次输入的密码不匹配") return self.cleaned_data['password2'] # 登录表单(使用Django 2.x+方式) class CustomLoginForm(AuthenticationForm): remember_me = forms.BooleanField(required=False, label="记住我") ``` ### 视图配置示例 ```python # urls.py (Django 2.x+) from django.contrib.auth.views import LoginView from .forms import CustomLoginForm urlpatterns = [ path('login/', LoginView.as_view( template_name='users/login.html', authentication_form=CustomLoginForm # 使用自定义表单 ), name='login'), ] ``` ### 关键注意事项 1. 如果使用自定义用户模型(如引用[2][3]),需在`settings.py`中配置: ```python AUTH_USER_MODEL = 'yourapp.CustomUser' ``` 2. 表单验证时,Django会自动处理密码哈希化,但需要在`views.py`中手动保存: ```python def register(request): if request.method == 'POST': form = UserRegistrationForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.set_password(form.cleaned_data['password']) # 密码哈希化 user.save() ``` 3. 对于登录视图,Django 3.x+要求使用`LoginView`类视图(如引用[4][5]),不再支持函数视图直接导入`login`[^1][^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值